Parking Slot Occupancy Detection¶

Authored by: Sabri Serkan Gulluoglu

Duration: 90 mins

Level: Intermediate

Pre-requisite Skills: Python Programming,Visual Studio Code,Data Analysis,Data Visualization, Machine Learning

Scenario

John works in the CBD, which is near where John lives.. He uses smart parking app to locate parking spots live hence this is where he gets his parking from these days. Upon. opening his phone early in the morning today , he immediately sees a free parking space close to their office building from where he also learns that usually around 09:00 AM there are other empty spaces at i this exact same spot for him to use. To schedule for tomorrow’s trip, John has hit on an option forecasting future parking space probabilities available for that day since there will be some kind of activity happening so people shall at least be prevented from parking anyhow..

Realizing this important information, John will have to be more cautious by leaving earlier than usual in order to guarantee his own parking lot on Friday morning. Not only does he appreciate how it help locate spots instantly but he is also able to obtain significant information such as future estimates on availability by analyzing previous patterns in terms of parking on the same app as well. Through this, he finds it possible to avoid time-wastage occasioned by looking for a space to leave his car every day..

What this use case will teach you

At the end of this use case you will

  • Learn how to import the dataset into a Pandas dataframe from various sources.

  • Understand how to clean the data by dropping unnecessary columns/rows and handling missing values, then reorganize data in a way that is suitable for visualization.

  • Visualize present/previous/timebased car park occupancy using libraries like Matplotlib, Seaborn.

  • Utilization reports: Generate reports on cars usage to push for the underutilized parts’ growth.

  • Policy Recommendations: Advice city council based on information for town transformations and parking arrangement shifts.

Definition and Restrictions¶

This use case aims to develop a smart parking system that assists drivers in finding available parking spots in real time. This smart parking system also includes forecasting future availability of parking slots. This will help reducing the time spent searching for parking and improving traffic flow in the city center. This system will collect and process data on parking occupancy, providing drivers with an updated information and navigation assistance. In addition to the system’s efficiency, also supports city planning by offering valuable insights into parking spots and demand. Furthermore contribute to a more organized and sustainable urban environment.

The study is restricted with the data analysis of Melbourne parking sensor data. Try merging Melbourne parking restriction data with Melbourne parking data.

Dataset¶

Dataset1: URL = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/' dataset_id = 'on-street-parking-bay-sensors'

Dataset2: https://data.melbourne.vic.gov.au/explore/dataset/on-street-car-parking-sensor-data-2020-jan-may/information/ on-street-car-parking-sensor-data-2020-jan-may / 2020 Jan-May Dataset API LINK is not available, only 'csv' file.

Dataset3: URL = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/' dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'

1. Installing Libraries¶

In [1]:
pip install pandas
Requirement already satisfied: pandas in c:\users\ssgul\anaconda3\lib\site-packages (2.2.2)
Requirement already satisfied: numpy>=1.26.0 in c:\users\ssgul\anaconda3\lib\site-packages (from pandas) (1.26.4)
Requirement already satisfied: python-dateutil>=2.8.2 in c:\users\ssgul\anaconda3\lib\site-packages (from pandas) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in c:\users\ssgul\anaconda3\lib\site-packages (from pandas) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in c:\users\ssgul\anaconda3\lib\site-packages (from pandas) (2023.3)
Requirement already satisfied: six>=1.5 in c:\users\ssgul\anaconda3\lib\site-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)
Note: you may need to restart the kernel to use updated packages.

2. Data Preprocesing¶

2.1. Requried Libraries¶

In [3]:
import pandas as pd
import numpy as np

2.2. DATASET1: FETCHING CSV FILE FROM REPOSITORY¶

To initiate the project, I began by downloading the parking dataset as a CSV file. It resulted in an understanding of the data structure as well as an initial data preprocessing stage. This way I managed to practice data cleaning, manipulation, visualization and other methods within a confined setting which included repetitive exercises on the same dataset until I grasped them fully. Once I was confident in managing the dataset effectively, I transitioned to fetching data directly through API links. This supported achieving the project’s key objective which entailed establishing a strong and expandable solution for detecting whether parking slots were full or not in real time based on dynamic data sources.

2.2.0 Read the Dataset in .csv extension¶

In [4]:
import pandas as pd
import numpy as np 

df = pd.read_csv('C:/deakin2024-T2/SIT764-TEAM_PROJECT/FOLDER-DATASETS/DATASETPRESENT.csv')
print(df.head().to_string())
                 Lastupdated           Status_Timestamp  Zone_Number Status_Description  KerbsideID                                 Location
0  2023-12-14T15:45:34+11:00  2023-12-14T14:41:25+11:00       7695.0         Unoccupied       22959   -37.81844776554182, 144.95938672872117
1  2023-12-14T15:45:34+11:00  2023-12-13T17:21:58+11:00       7939.0         Unoccupied       10136    -37.8099909364941, 144.95263753679632
2  2023-12-15T10:45:34+11:00  2023-12-15T10:35:02+11:00          NaN         Unoccupied        6527   -37.81060096851364, 144.95642622505966
3  2023-12-15T10:45:34+11:00  2023-12-15T09:39:46+11:00          NaN         Unoccupied        6526  -37.810581463657826, 144.95649292476088
4  2023-12-18T15:45:34+11:00  2023-12-18T10:47:54+11:00       7310.0         Unoccupied        6497   -37.81044576734748, 144.95648958199024

2.3. Rename some of the columns for improving understanding¶

In [5]:
# Rename the columns 
import pandas as pd
import numpy as np

df = pd.read_csv('C:/deakin2024-T2/SIT764-TEAM_PROJECT/FOLDER-DATASETS/DATASETPRESENT.csv')
df.rename(columns={'Lastupdated': 'Finishtime'}, inplace=True)
df.rename(columns={'Status_Timestamp': 'Starttime'}, inplace=True)
print(df.head().to_string())
                  Finishtime                  Starttime  Zone_Number Status_Description  KerbsideID                                 Location
0  2023-12-14T15:45:34+11:00  2023-12-14T14:41:25+11:00       7695.0         Unoccupied       22959   -37.81844776554182, 144.95938672872117
1  2023-12-14T15:45:34+11:00  2023-12-13T17:21:58+11:00       7939.0         Unoccupied       10136    -37.8099909364941, 144.95263753679632
2  2023-12-15T10:45:34+11:00  2023-12-15T10:35:02+11:00          NaN         Unoccupied        6527   -37.81060096851364, 144.95642622505966
3  2023-12-15T10:45:34+11:00  2023-12-15T09:39:46+11:00          NaN         Unoccupied        6526  -37.810581463657826, 144.95649292476088
4  2023-12-18T15:45:34+11:00  2023-12-18T10:47:54+11:00       7310.0         Unoccupied        6497   -37.81044576734748, 144.95648958199024

2.4. Checking for Missing Values in Dataframe¶

In [6]:
# Check for missing values
print(df.isnull().sum())
Finishtime              0
Starttime               0
Zone_Number           500
Status_Description      0
KerbsideID              0
Location                0
dtype: int64

2.5. Delete the rows with missing values¶

In [5]:
# Drop rows where 'Zone_Number' is NaN
df= df.dropna(subset=['Zone_Number'])
print(df.head())
                  Finishtime                  Starttime  Zone_Number  \
0  2023-12-14T15:45:34+11:00  2023-12-14T14:41:25+11:00       7695.0   
1  2023-12-14T15:45:34+11:00  2023-12-13T17:21:58+11:00       7939.0   
4  2023-12-18T15:45:34+11:00  2023-12-18T10:47:54+11:00       7310.0   
5  2023-12-18T15:45:34+11:00  2023-11-02T11:47:52+11:00       7050.0   
6  2023-12-18T15:45:34+11:00  2023-12-18T15:03:50+11:00       7310.0   

  Status_Description  KerbsideID                                 Location  
0         Unoccupied       22959   -37.81844776554182, 144.95938672872117  
1         Unoccupied       10136    -37.8099909364941, 144.95263753679632  
4         Unoccupied        6497   -37.81044576734748, 144.95648958199024  
5            Present        8958   -37.80588632122739, 144.95989190405095  
6         Unoccupied       25139  -37.810361269606986, 144.95724275778542  

2.6. Statistical Analysis¶

fetch the data from the csv file, found and listed the rows which has missing values, filled the missing values with matching other column-row values, calculate the parking time by subtracting finish time-Start time columns. the new file(csv format) is also added (with the filled values) to the repository.

findings about the below code: as I understand that the code needs to be improved to find the parking hours, because of the format of the status_Timestamp column and Lastupdated columns, the code can not calculate. so firstly, I need to change the format of column from UTC to Melbourne time zone. In the following code , the same code will be improved.

In [7]:
import pandas as pd
from datetime import datetime

# Load data from CSV
file_path = 'C:/deakin2024-T2/SIT764-TEAM_PROJECT/FOLDER-DATASETS/DATASETPRESENT.csv' 
df = pd.read_csv(file_path)

# Display rows with missing values
missing_values = df[df.isnull().any(axis=1)]
print("Rows with missing values:")
print(missing_values)

# Fill missing values by forward filling or backward filling
df_filled = df.fillna(method='ffill').fillna(method='bfill')

# Calculate parking time
def calculate_parking_time(Status_Timestamp, Lastupdated):
    try:
        start = datetime.strptime(Status_Timestamp, '%Y-%m-%d %H:%M:%S')
        finish = datetime.strptime(Lastupdated, '%Y-%m-%d %H:%M:%S')
        return (finish - start).total_seconds() / 3600  # Parking time in hours
    except:
        return None

df_filled['Parking Time (Hours)'] = df_filled.apply(
    lambda row: calculate_parking_time(row['Status_Timestamp'], row['Lastupdated']), axis=1
)

# Save the modified DataFrame to a new CSV file
output_file_path = 'your_filled_file.csv'  
df_filled.to_csv(output_file_path, index=False)

print("Data processing complete. Check the output file for results.")
Rows with missing values:
                    Lastupdated           Status_Timestamp  Zone_Number  \
2     2023-12-15T10:45:34+11:00  2023-12-15T10:35:02+11:00          NaN   
3     2023-12-15T10:45:34+11:00  2023-12-15T09:39:46+11:00          NaN   
9     2023-11-15T15:44:42+11:00  2023-11-08T07:41:02+11:00          NaN   
10    2023-11-15T15:44:42+11:00  2023-11-09T06:01:24+11:00          NaN   
12    2023-11-15T15:44:42+11:00  2023-11-09T11:08:31+11:00          NaN   
...                         ...                        ...          ...   
6222  2024-08-02T17:08:26+10:00  2024-08-02T16:53:16+10:00          NaN   
6227  2024-08-02T17:08:26+10:00  2024-08-02T11:53:42+10:00          NaN   
6240  2024-08-02T17:08:26+10:00  2024-08-02T16:51:17+10:00          NaN   
6250  2024-08-02T17:08:26+10:00  2024-08-02T15:48:23+10:00          NaN   
6257  2024-08-02T17:08:26+10:00  2024-08-02T10:23:17+10:00          NaN   

     Status_Description  KerbsideID                                 Location  
2            Unoccupied        6527   -37.81060096851364, 144.95642622505966  
3            Unoccupied        6526  -37.810581463657826, 144.95649292476088  
9            Unoccupied       23748    -37.8107644042888, 144.97004851293588  
10           Unoccupied       24184   -37.81070410789455, 144.96981076064492  
12           Unoccupied       23746    -37.81065943880609, 144.9700003687169  
...                 ...         ...                                      ...  
6222            Present       63221    -37.8168909903052, 144.95761059614463  
6227            Present       61528  -37.819257098929555, 144.95741383960632  
6240         Unoccupied       65227    -37.81120264052758, 144.9656285162551  
6250         Unoccupied       54248  -37.815645480403646, 144.96087041827332  
6257         Unoccupied       54062    -37.81747138402189, 144.9617132756285  

[500 rows x 6 columns]
Data processing complete. Check the output file for results.
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\4194882621.py:14: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df_filled = df.fillna(method='ffill').fillna(method='bfill')

2.7. Formatting on Dataset¶

-the format of column from UTC to Melbourne time zone -to do this, we need to install pytz from pandas library. -find the improved code below.

2.7.1. Needed Installians before running the code¶

pip install pandas pytz

In [ ]:
import pandas as pd
import pytz

# Load the data from the CSV file
file_path = 'C:/Users/ssgul/OneDrive/Documents/GitHub/MOP-Code/sgulluoglu/DATASETPRESENT.csv' 
df = pd.read_csv(file_path)

# List the column names
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    utc_zone = pytz.utc
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    
    # Convert the string to a datetime object
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    
    # Convert to Melbourne time
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x))
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Print the updated columns
print("\nUpdated DataFrame:")
print(df.head())

2.8. Statistical Analysis¶

In this coding phase, I performed basic statistical calculations to explore and analyze the dataset effectively. Key tasks included calculating parking time to understand usage patterns, rechecking missing values to ensure data quality, and filling missing values by referencing data from other columns or rows. Additionally, I listed all missing values systematically for further inspection. To enhance temporal analysis, I defined a timezone conversion function, ensuring uniformity in timestamp data across different zones. These steps were integral to preparing the dataset for advanced modeling and ensured a robust foundation for predictive analysis and machine learning model development.

In [8]:
import pandas as pd
import pytz


file_path = 'C:/deakin2024-T2/SIT764-TEAM_PROJECT/FOLDER-DATASETS/DATASETPRESENT.csv' 
df = pd.read_csv(file_path)

# List the column names
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    utc_zone = pytz.utc
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    
    # Convert the string to a datetime object
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    
    # Convert to Melbourne time
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# List missing values
print("\nMissing Values:")
print(df.isnull().sum())

# Fill missing values with values from other columns/rows
# use forward fill and backward fill 
df.fillna(method='ffill', inplace=True)  # Forward fill
df.fillna(method='bfill', inplace=True)  # Backward fill

# Recheck missing values
print("\nMissing Values After Filling:")
print(df.isnull().sum())

# Calculate the parking time
if 'Lastupdated' in df.columns and 'Status_Timestamp' in df.columns:
    df['parking_time'] = (df['Lastupdated'] - df['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes
    print("\nDataFrame with Parking Time:")
    print(df[['Lastupdated', 'Status_Timestamp', 'parking_time']].head())
else:
    print("Required columns for parking time calculation are missing.")
Column Names:
['Lastupdated', 'Status_Timestamp', 'Zone_Number', 'Status_Description', 'KerbsideID', 'Location']
Updated Column: Lastupdated
Updated Column: Status_Timestamp

Missing Values:
Lastupdated             0
Status_Timestamp        0
Zone_Number           500
Status_Description      0
KerbsideID              0
Location                0
dtype: int64

Missing Values After Filling:
Lastupdated           0
Status_Timestamp      0
Zone_Number           0
Status_Description    0
KerbsideID            0
Location              0
dtype: int64

DataFrame with Parking Time:
                Lastupdated          Status_Timestamp  parking_time
0 2023-12-14 15:45:34+11:00 2023-12-14 14:41:25+11:00     64.150000
1 2023-12-14 15:45:34+11:00 2023-12-13 17:21:58+11:00   1343.600000
2 2023-12-15 10:45:34+11:00 2023-12-15 10:35:02+11:00     10.533333
3 2023-12-15 10:45:34+11:00 2023-12-15 09:39:46+11:00     65.800000
4 2023-12-18 15:45:34+11:00 2023-12-18 10:47:54+11:00    297.666667
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\3236260662.py:41: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='ffill', inplace=True)  # Forward fill
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\3236260662.py:42: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='bfill', inplace=True)  # Backward fill

2.9. Statistical Analysis¶

In addition to the previous code, I extended the functionality by listing all the columns in the dataset to ensure a comprehensive understanding of its structure. This step helped identify critical features and assess their relevance to the analysis. After completing the required preprocessing tasks such as calculating parking time, rechecking and filling missing values, and defining the timezone conversion function, I saved the updated dataframe to a new CSV file. This allowed me to maintain a clean, processed dataset for subsequent steps, ensuring consistency and readiness for further modeling and analysis phases.

In [9]:
import pandas as pd
import pytz


file_path = 'C:/deakin2024-T2/SIT764-TEAM_PROJECT/FOLDER-DATASETS/DATASETPRESENT.csv'  
df = pd.read_csv(file_path)

# List the column names
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    if pd.notnull(utc_time_str):
        utc_zone = pytz.utc
        melbourne_zone = pytz.timezone('Australia/Melbourne')
        
        # Convert the string to a datetime object
        utc_time = pd.to_datetime(utc_time_str, utc=True)
        
        # Convert to Melbourne time
        melbourne_time = utc_time.tz_convert(melbourne_zone)
        return melbourne_time
    return utc_time_str

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(convert_utc_to_melbourne)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# List missing values
print("\nMissing Values:")
print(df.isnull().sum())

# Fill missing values with values from other columns/rows
# use forward fill and backward fill
df.fillna(method='ffill', inplace=True)  # Forward fill
df.fillna(method='bfill', inplace=True)  # Backward fill

# Recheck missing values
print("\nMissing Values After Filling:")
print(df.isnull().sum())

# Calculate the parking time
if 'Lastupdated' in df.columns and 'Status_Timestamp' in df.columns:
    df['parking_time'] = (df['Lastupdated'] - df['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes
    print("\nDataFrame with Parking Time:")
    print(df[['Lastupdated', 'Status_Timestamp', 'parking_time']].head())
else:
    print("Required columns for parking time calculation are missing.")

# Save the DataFrame to a new CSV file
output_file_path = 'updated_file.csv'  
df.to_csv(output_file_path, index=False)

print(f"\nData saved to '{output_file_path}'")
Column Names:
['Lastupdated', 'Status_Timestamp', 'Zone_Number', 'Status_Description', 'KerbsideID', 'Location']
Updated Column: Lastupdated
Updated Column: Status_Timestamp

Missing Values:
Lastupdated             0
Status_Timestamp        0
Zone_Number           500
Status_Description      0
KerbsideID              0
Location                0
dtype: int64

Missing Values After Filling:
Lastupdated           0
Status_Timestamp      0
Zone_Number           0
Status_Description    0
KerbsideID            0
Location              0
dtype: int64

DataFrame with Parking Time:
                Lastupdated          Status_Timestamp  parking_time
0 2023-12-14 15:45:34+11:00 2023-12-14 14:41:25+11:00     64.150000
1 2023-12-14 15:45:34+11:00 2023-12-13 17:21:58+11:00   1343.600000
2 2023-12-15 10:45:34+11:00 2023-12-15 10:35:02+11:00     10.533333
3 2023-12-15 10:45:34+11:00 2023-12-15 09:39:46+11:00     65.800000
4 2023-12-18 15:45:34+11:00 2023-12-18 10:47:54+11:00    297.666667
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\3441916379.py:43: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='ffill', inplace=True)  # Forward fill
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\3441916379.py:44: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='bfill', inplace=True)  # Backward fill
Data saved to 'updated_file.csv'

2.10. Statistical Analysis¶

To enhance data processing, I converted the categorical column Status_Description to an integer format, mapping "unoccupied" to 0 and "present" to 1. This transformation optimized the dataset for machine learning algorithms by ensuring compatibility and improving computational efficiency during predictive modeling and analysis.

In [10]:
import pandas as pd

# Load the data from the CSV file
file_path = 'C:/deakin2024-T2/SIT764-TEAM_PROJECT/FOLDER-DATASETS/DATASETPRESENT.csv' 
df = pd.read_csv(file_path)

# Display the original DataFrame
print("Original DataFrame:")
print(df.head())

# Convert 'Status_Description' values to integer
status_mapping = {'Unoccupied': 0, 'Present': 1}

# Check if the column exists and perform 
if 'Status_Description' in df.columns:
    df['Status_Description'] = df['Status_Description'].map(status_mapping)
    print("\nUpdated 'Status_Description' Column:")
    print(df[['Status_Description']].head())
else:
    print("Column 'Status_Description' not found in the data")

# Save the updated DataFrame to a new CSV file
#output_file_path = 'updated_file.csv' 
#df.to_csv(output_file_path, index=False)

#print(f"\nData saved to '{output_file_path}'")
Original DataFrame:
                 Lastupdated           Status_Timestamp  Zone_Number  \
0  2023-12-14T15:45:34+11:00  2023-12-14T14:41:25+11:00       7695.0   
1  2023-12-14T15:45:34+11:00  2023-12-13T17:21:58+11:00       7939.0   
2  2023-12-15T10:45:34+11:00  2023-12-15T10:35:02+11:00          NaN   
3  2023-12-15T10:45:34+11:00  2023-12-15T09:39:46+11:00          NaN   
4  2023-12-18T15:45:34+11:00  2023-12-18T10:47:54+11:00       7310.0   

  Status_Description  KerbsideID                                 Location  
0         Unoccupied       22959   -37.81844776554182, 144.95938672872117  
1         Unoccupied       10136    -37.8099909364941, 144.95263753679632  
2         Unoccupied        6527   -37.81060096851364, 144.95642622505966  
3         Unoccupied        6526  -37.810581463657826, 144.95649292476088  
4         Unoccupied        6497   -37.81044576734748, 144.95648958199024  

Updated 'Status_Description' Column:
   Status_Description
0                   0
1                   0
2                   0
3                   0
4                   0

2.11. Visualization¶

Geographic Coordinate System To enhance geospatial analysis, I processed the Location column by splitting it into two separate columns: Longitude and Latitude. This transformation facilitated more precise handling of geographic data, enabling advanced spatial analysis tasks such as mapping, clustering, and distance calculations.

In [11]:
import pandas as pd

# Load data from CSV
file_path = 'C:/deakin2024-T2/SIT764-TEAM_PROJECT/FOLDER-DATASETS/DATASETPRESENT.csv' 
df = pd.read_csv(file_path)

# Display the first few rows of the dataset to understand its structure
print("Original DataFrame:")
print(df.head())

# Function to split the Location column into Latitude and Longitude
def split_location(location):
    try:
        lat, lon = location.split(',')
        return pd.Series([float(lat), float(lon)], index=['Latitude', 'Longitude'])
    except:
        return pd.Series([None, None], index=['Latitude', 'Longitude'])

# Apply the split function to create new Latitude and Longitude columns
df[['Latitude', 'Longitude']] = df['Location'].apply(split_location)

# Drop the original Location column if no longer needed
df = df.drop(columns=['Location'])

# Save the modified DataFrame to a new CSV file
output_file_path = 'updated_file.csv'  # Replace with your desired output file path
df.to_csv(output_file_path, index=False)

print("Data processing complete. Check the output file for results.")
Original DataFrame:
                 Lastupdated           Status_Timestamp  Zone_Number  \
0  2023-12-14T15:45:34+11:00  2023-12-14T14:41:25+11:00       7695.0   
1  2023-12-14T15:45:34+11:00  2023-12-13T17:21:58+11:00       7939.0   
2  2023-12-15T10:45:34+11:00  2023-12-15T10:35:02+11:00          NaN   
3  2023-12-15T10:45:34+11:00  2023-12-15T09:39:46+11:00          NaN   
4  2023-12-18T15:45:34+11:00  2023-12-18T10:47:54+11:00       7310.0   

  Status_Description  KerbsideID                                 Location  
0         Unoccupied       22959   -37.81844776554182, 144.95938672872117  
1         Unoccupied       10136    -37.8099909364941, 144.95263753679632  
2         Unoccupied        6527   -37.81060096851364, 144.95642622505966  
3         Unoccupied        6526  -37.810581463657826, 144.95649292476088  
4         Unoccupied        6497   -37.81044576734748, 144.95648958199024  
Data processing complete. Check the output file for results.

2.12. Whole code after statistical analysis¶

All Code in one screen

-the format of column from UTC to Melbourne time zone -found and listed the rows which has missing values, filled the missing values with matching other column-row values, calculate the parking time by subtracting finish time-Start time columns. -change the parking 'Status_Description' to integer. (where unoccupied is 0, present is 1) -Geographic Coordinate System- Split the Column 'Location' into Longitude and Latitude. -calculate parking time in minutes - add a parking time column

  • the new file(csv format) is also added (with the filled values) to the repository.
In [12]:
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
import pytz

# Defining file paths
input_file_path = 'C:/deakin2024-T2/SIT764-TEAM_PROJECT/FOLDER-DATASETS/DATASETPRESENT.csv'  
output_file_path = 'processed_data.csv'  #  output file path
plot_file_path = 'kerbside_usage_plot.png'  # Replace with your desired plot file path

# Load data from CSV
df = pd.read_csv(input_file_path)

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    if pd.notnull(utc_time_str):
        utc_zone = pytz.utc
        melbourne_zone = pytz.timezone('Australia/Melbourne')
        
        # Convert the string to a datetime object
        utc_time = pd.to_datetime(utc_time_str, utc=True)
        
        # Convert to Melbourne time
        melbourne_time = utc_time.tz_convert(melbourne_zone)
        return melbourne_time
    return utc_time_str

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(convert_utc_to_melbourne)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Calculate the parking time
if 'Lastupdated' in df.columns and 'Status_Timestamp' in df.columns:
    df['parking_time'] = (df['Lastupdated'] - df['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes
    print("\nDataFrame with Parking Time:")
    print(df[['Lastupdated', 'Status_Timestamp', 'parking_time']].head())
else:
    print("Required columns for parking time calculation are missing.")

# Fill missing values in the DataFrame by forward filling and backward filling
df_filled = df.fillna(method='ffill').fillna(method='bfill')

# Convert 'Status_Description' to integer
status_mapping = {'Unoccupied': 0, 'Present': 1}
df_filled['Status_Description'] = df_filled['Status_Description'].map(status_mapping)

# Split 'Location' column into Latitude and Longitude
def split_location(Location):
    try:
        lat, lon = Location.split(',')
        return pd.Series([float(lat), float(lon)], index=['Latitude', 'Longitude'])
    except:
        return pd.Series([None, None], index=['Latitude', 'Longitude'])
df_filled[['Latitude', 'Longitude']] = df_filled['Location'].apply(split_location)

# Save the processed DataFrame to a new CSV file
df_filled.to_csv(output_file_path, index=False)

print("Data processing complete. Check the output file for results.")
Updated Column: Lastupdated
Updated Column: Status_Timestamp

DataFrame with Parking Time:
                Lastupdated          Status_Timestamp  parking_time
0 2023-12-14 15:45:34+11:00 2023-12-14 14:41:25+11:00     64.150000
1 2023-12-14 15:45:34+11:00 2023-12-13 17:21:58+11:00   1343.600000
2 2023-12-15 10:45:34+11:00 2023-12-15 10:35:02+11:00     10.533333
3 2023-12-15 10:45:34+11:00 2023-12-15 09:39:46+11:00     65.800000
4 2023-12-18 15:45:34+11:00 2023-12-18 10:47:54+11:00    297.666667
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\676833277.py:48: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df_filled = df.fillna(method='ffill').fillna(method='bfill')
Data processing complete. Check the output file for results.

3. API Link - Practising for learning how to work with an API Link¶

DATASET1: API LINK CONNECTION Fetching DATA with an API link : https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/on-street-parking-bay-sensors/records?limit=20 City of Melbourne - On Street Parking Bay Sensors

In [39]:
import requests

# URL of the API endpoint
api_url = "https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/on-street-parking-bay-sensors/records?limit=20"

# Sending a GET request to the API
response = requests.get(api_url)

# Checking if the request was successful
if response.status_code == 200:
    # Parsing the JSON response
    data = response.json()
    
    # Printing the data
    print(data)
else:
    print(f"Failed to retrieve data. HTTP Status code: {response.status_code}")
{'total_count': 6264, 'results': [{'lastupdated': '2023-12-14T04:45:34+00:00', 'status_timestamp': '2023-12-14T03:41:25+00:00', 'zone_number': 7695, 'status_description': 'Unoccupied', 'kerbsideid': 22959, 'location': {'lon': 144.95938672872117, 'lat': -37.81844776554182}}, {'lastupdated': '2023-12-14T04:45:34+00:00', 'status_timestamp': '2023-12-13T06:21:58+00:00', 'zone_number': 7939, 'status_description': 'Unoccupied', 'kerbsideid': 10136, 'location': {'lon': 144.95263753679632, 'lat': -37.8099909364941}}, {'lastupdated': '2023-12-14T23:45:34+00:00', 'status_timestamp': '2023-12-14T23:35:02+00:00', 'zone_number': None, 'status_description': 'Unoccupied', 'kerbsideid': 6527, 'location': {'lon': 144.95642622505966, 'lat': -37.81060096851364}}, {'lastupdated': '2023-12-14T23:45:34+00:00', 'status_timestamp': '2023-12-14T22:39:46+00:00', 'zone_number': None, 'status_description': 'Unoccupied', 'kerbsideid': 6526, 'location': {'lon': 144.95649292476088, 'lat': -37.810581463657826}}, {'lastupdated': '2023-12-18T04:45:34+00:00', 'status_timestamp': '2023-12-17T23:47:54+00:00', 'zone_number': 7310, 'status_description': 'Unoccupied', 'kerbsideid': 6497, 'location': {'lon': 144.95648958199024, 'lat': -37.81044576734748}}, {'lastupdated': '2023-12-18T04:45:34+00:00', 'status_timestamp': '2023-11-02T00:47:52+00:00', 'zone_number': 7050, 'status_description': 'Present', 'kerbsideid': 8958, 'location': {'lon': 144.95989190405095, 'lat': -37.80588632122739}}, {'lastupdated': '2023-12-18T04:45:34+00:00', 'status_timestamp': '2023-12-18T04:03:50+00:00', 'zone_number': 7310, 'status_description': 'Unoccupied', 'kerbsideid': 25139, 'location': {'lon': 144.95724275778542, 'lat': -37.810361269606986}}, {'lastupdated': '2023-12-18T04:45:34+00:00', 'status_timestamp': '2023-12-18T03:40:13+00:00', 'zone_number': 7310, 'status_description': 'Present', 'kerbsideid': 6520, 'location': {'lon': 144.95744087370286, 'lat': -37.81030372866985}}, {'lastupdated': '2023-11-15T04:44:42+00:00', 'status_timestamp': '2023-11-15T01:35:58+00:00', 'zone_number': 7363, 'status_description': 'Present', 'kerbsideid': 61840, 'location': {'lon': 144.96998804813268, 'lat': -37.81456548009633}}, {'lastupdated': '2023-11-15T04:44:42+00:00', 'status_timestamp': '2023-11-07T20:41:02+00:00', 'zone_number': None, 'status_description': 'Unoccupied', 'kerbsideid': 23748, 'location': {'lon': 144.97004851293588, 'lat': -37.8107644042888}}, {'lastupdated': '2023-11-15T04:44:42+00:00', 'status_timestamp': '2023-11-08T19:01:24+00:00', 'zone_number': None, 'status_description': 'Unoccupied', 'kerbsideid': 24184, 'location': {'lon': 144.96981076064492, 'lat': -37.81070410789455}}, {'lastupdated': '2023-11-15T04:44:42+00:00', 'status_timestamp': '2023-11-08T21:17:07+00:00', 'zone_number': 7359, 'status_description': 'Present', 'kerbsideid': 61926, 'location': {'lon': 144.96752972730866, 'lat': -37.81512217630161}}, {'lastupdated': '2023-11-15T04:44:42+00:00', 'status_timestamp': '2023-11-09T00:08:31+00:00', 'zone_number': None, 'status_description': 'Unoccupied', 'kerbsideid': 23746, 'location': {'lon': 144.9700003687169, 'lat': -37.81065943880609}}, {'lastupdated': '2023-11-15T04:44:42+00:00', 'status_timestamp': '2023-11-07T21:08:38+00:00', 'zone_number': None, 'status_description': 'Present', 'kerbsideid': 23747, 'location': {'lon': 144.97002446884815, 'lat': -37.810711917471764}}, {'lastupdated': '2023-10-25T01:44:02+00:00', 'status_timestamp': '2023-10-25T01:07:05+00:00', 'zone_number': 7556, 'status_description': 'Present', 'kerbsideid': 5730, 'location': {'lon': 144.9680525765466, 'lat': -37.81058233418289}}, {'lastupdated': '2023-10-25T01:44:02+00:00', 'status_timestamp': '2023-10-25T00:57:43+00:00', 'zone_number': 7556, 'status_description': 'Present', 'kerbsideid': 5728, 'location': {'lon': 144.9681094607273, 'lat': -37.810565621747756}}, {'lastupdated': '2023-10-25T01:44:02+00:00', 'status_timestamp': '2023-10-25T01:12:46+00:00', 'zone_number': 7556, 'status_description': 'Present', 'kerbsideid': 5750, 'location': {'lon': 144.9681371221672, 'lat': -37.810557675202986}}, {'lastupdated': '2023-10-25T01:44:02+00:00', 'status_timestamp': '2023-10-24T19:31:04+00:00', 'zone_number': 7556, 'status_description': 'Present', 'kerbsideid': 5743, 'location': {'lon': 144.96894664505558, 'lat': -37.81032080322752}}, {'lastupdated': '2023-10-25T01:44:02+00:00', 'status_timestamp': '2023-10-24T23:56:41+00:00', 'zone_number': 7556, 'status_description': 'Present', 'kerbsideid': 5749, 'location': {'lon': 144.96906243015667, 'lat': -37.810286443609954}}, {'lastupdated': '2023-10-25T01:44:02+00:00', 'status_timestamp': '2023-10-25T01:33:40+00:00', 'zone_number': 7556, 'status_description': 'Present', 'kerbsideid': 5745, 'location': {'lon': 144.96918056533195, 'lat': -37.81025191758637}}]}

3.1. Found missing Values¶

In [40]:
import requests
import pandas as pd

# Dataset identifier 
dataset_id = "on-street-parking-bay-sensors"  
# API link 
api_url = "https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/on-street-parking-bay-sensors/records?limit=20"  
# Fetch the data from the API
response = requests.get(api_url)

# Check if the request was successful
if response.status_code == 200:
    data = response.json()
    # Convert the data to a DataFrame
    df = pd.DataFrame(data)
    
    # Identify missing values
    missing_values = df.isnull()
    print("Missing Values (True indicates missing value):")
    print(missing_values)

    # Count missing values in each column
    missing_count = df.isnull().sum()
    print("\nCount of Missing Values in Each Column:")
    print(missing_count)

    # Identify rows with any missing values
    rows_with_missing = df[df.isnull().any(axis=1)]
    print("\nRows with Any Missing Values:")
    print(rows_with_missing)

    # Count total missing values in the DataFrame
    total_missing = df.isnull().sum().sum()
    print("\nTotal Number of Missing Values in the DataFrame:")
    print(total_missing)

    # Percentage of missing values in each column
    missing_percentage = (df.isnull().sum() / len(df)) * 100
    print("\nPercentage of Missing Values in Each Column:")
    print(missing_percentage)
else:
    print(f"Failed to fetch data from the API. Status code: {response.status_code}")
Missing Values (True indicates missing value):
    total_count  results
0         False    False
1         False    False
2         False    False
3         False    False
4         False    False
5         False    False
6         False    False
7         False    False
8         False    False
9         False    False
10        False    False
11        False    False
12        False    False
13        False    False
14        False    False
15        False    False
16        False    False
17        False    False
18        False    False
19        False    False

Count of Missing Values in Each Column:
total_count    0
results        0
dtype: int64

Rows with Any Missing Values:
Empty DataFrame
Columns: [total_count, results]
Index: []

Total Number of Missing Values in the DataFrame:
0

Percentage of Missing Values in Each Column:
total_count    0.0
results        0.0
dtype: float64

Creating a timezone object for Melbourne, find the current time in UTC, CHANGE IT TO MELBOURNE LOCAL TIME,

3.1.1 Practising on API Dataset I¶

In this code, I implemented a function to convert the time zone, ensuring all timestamps align with the local time for accurate temporal analysis in the parking slot occupancy detection dataset. Additionally, I addressed missing values by filling them with data from adjacent rows or columns, maintaining dataset consistency and integrity.

In [41]:
import requests
import pandas as pd
from datetime import datetime
import pytz


dataset_id = "on-street-parking-bay-sensors" 

# Get the current time in UTC
utc_time = datetime.utcnow()
print(f"Current UTC Time: {utc_time}")

# Convert UTC time to Melbourne local time
melbourne_tz = pytz.timezone('Australia/Melbourne')
melbourne_time = utc_time.replace(tzinfo=pytz.utc).astimezone(melbourne_tz)
print(f"Current Melbourne Time: {melbourne_time}")

# API link 
api_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/on-street-parking-bay-sensors/records?limit=100&offset=6000'  

# Include the Melbourne time in the API request 
params = {
    'dataset_id': dataset_id,
    'melbourne_time': melbourne_time.strftime('%Y-%m-%d %H:%M:%S')
}

# Fetch the data from the API
response = requests.get(api_url, params=params)

# Check if the request was successful
if response.status_code == 200:
    data = response.json()
    # Convert the data to a DataFrame
    df = pd.DataFrame(data)
    
    print(f"\nDataset Identifier: {dataset_id}")
    print(f"Current Melbourne Time: {melbourne_time}")
    
    # Identify missing values
    missing_values = df.isnull()
    print("\nMissing Values (True indicates missing value):")
    print(missing_values)

    # Count missing values in each column
    missing_count = df.isnull().sum()
    print("\nCount of Missing Values in Each Column:")
    print(missing_count)

    # Identify rows with any missing values
    rows_with_missing = df[df.isnull().any(axis=1)]
    print("\nRows with Any Missing Values:")
    print(rows_with_missing)

    # Count total missing values in the DataFrame
    total_missing = df.isnull().sum().sum()
    print("\nTotal Number of Missing Values in the DataFrame:")
    print(total_missing)

    # Percentage of missing values in each column
    missing_percentage = (df.isnull().sum() / len(df)) * 100
    print("\nPercentage of Missing Values in Each Column:")
    print(missing_percentage)
else:
    print(f"Failed to fetch data from the API. Status code: {response.status_code}")
C:\Users\ssgul\AppData\Local\Temp\ipykernel_10488\770792660.py:10: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
  utc_time = datetime.utcnow()
Current UTC Time: 2024-09-18 01:35:23.590630
Current Melbourne Time: 2024-09-18 11:35:23.590630+10:00

Dataset Identifier: on-street-parking-bay-sensors
Current Melbourne Time: 2024-09-18 11:35:23.590630+10:00

Missing Values (True indicates missing value):
    total_count  results
0         False    False
1         False    False
2         False    False
3         False    False
4         False    False
..          ...      ...
95        False    False
96        False    False
97        False    False
98        False    False
99        False    False

[100 rows x 2 columns]

Count of Missing Values in Each Column:
total_count    0
results        0
dtype: int64

Rows with Any Missing Values:
Empty DataFrame
Columns: [total_count, results]
Index: []

Total Number of Missing Values in the DataFrame:
0

Percentage of Missing Values in Each Column:
total_count    0.0
results        0.0
dtype: float64

3.2. Practising on the API Dataset II¶

In this code, I identified the type of variables in the dataset to distinguish between categorical, numerical, and datetime features. This step is crucial for understanding the dataset structure and determining appropriate preprocessing techniques for each variable type, such as encoding for categorical variables or scaling for numerical ones.

In [42]:
import requests
import pandas as pd


api_url = "https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/on-street-parking-bay-sensors/records?limit=100&offset=6000"  

response = requests.get(api_url)

if response.status_code == 200:
    data = response.json()
 
    df = pd.DataFrame(data)
    
 
    print("DataFrame:")
    print(df.head())

    variable_types = df.dtypes
    
 
    print("\nTypes of Variables in the DataFrame:")
    print(variable_types)
else:
    print(f"Failed to fetch data from the API. Status code: {response.status_code}")
DataFrame:
   total_count                                            results
0         6264  {'lastupdated': '2024-09-18T01:36:26+00:00', '...
1         6264  {'lastupdated': '2024-09-18T01:36:26+00:00', '...
2         6264  {'lastupdated': '2024-09-18T01:36:26+00:00', '...
3         6264  {'lastupdated': '2024-09-18T01:36:26+00:00', '...
4         6264  {'lastupdated': '2024-09-18T01:36:26+00:00', '...

Types of Variables in the DataFrame:
total_count     int64
results        object
dtype: object

Based on the above result, total_count contains numerical counts (such as total number of results) results contain more complex data, for example JSON strings, it is accepted as object type in pandas. Lastly, we need to look in detail to The object type for further analysis to understand the detailed contents.

4. API Data Retrieval and Initial Statistical Analysis¶

This code fetches the "on-street parking bay sensors" dataset from the City of Melbourne's API. It constructs the API URL by combining a base_url with the dataset_id. The params dictionary specifies query parameters, such as selecting all columns select':'*'", retrieving all rows limit':-1, setting the language to English lang':'en', and specifying the timezone as UTC.

Using the requests.get method, the script sends a GET request to fetch the dataset. If the request is successful status_code == 200, the response content is decoded and loaded into a Pandas DataFrame for analysis, printing the first 100 rows.

In [ ]:
base_url='https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id='on-street-parking-bay-sensors'


url=f'{base_url}{dataset_id}/exports/csv'
params={'select':'*','limit':-1,'lang':'en','timezone':'UTC'}

response=requests.get(url,params=params)

if response.status_code==200:
    url_content=response.content.decode('utf-8')
    places=pd.read_csv(StringIO(url_content),delimiter=';')
    print(places.head(100))
else:
    print(f'Request failed with status code {response.status_code}')base_url='https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id='on-street-parking-bay-sensors'


url=f'{base_url}{dataset_id}/exports/csv'
params={'select':'*','limit':-1,'lang':'en','timezone':'UTC'}

response=requests.get(url,params=params)

if response.status_code==200:
    url_content=response.content.decode('utf-8')
    places=pd.read_csv(StringIO(url_content),delimiter=';')
    print(places.head(100))
else:
    print(f'Request failed with status code {response.status_code}')

 
                  lastupdated           status_timestamp  zone_number  \
0   2023-12-14T04:45:34+00:00  2023-12-14T03:41:25+00:00       7695.0   
1   2023-12-14T04:45:34+00:00  2023-12-13T06:21:58+00:00       7939.0   
2   2023-12-14T23:45:34+00:00  2023-12-14T23:35:02+00:00          NaN   
3   2023-12-14T23:45:34+00:00  2023-12-14T22:39:46+00:00          NaN   
4   2023-12-18T04:45:34+00:00  2023-12-17T23:47:54+00:00       7310.0   
..                        ...                        ...          ...   
95  2023-11-22T00:44:42+00:00  2023-11-13T00:45:16+00:00       7610.0   
96  2023-11-22T00:44:42+00:00  2023-11-15T22:47:11+00:00       7610.0   
97  2023-11-22T00:44:42+00:00  2023-11-22T00:25:27+00:00       7611.0   
98  2023-11-22T00:44:42+00:00  2023-11-22T00:40:17+00:00       7611.0   
99  2023-11-22T00:44:42+00:00  2023-11-21T23:49:35+00:00       7611.0   

   status_description  kerbsideid                                 location  
0          Unoccupied       22959   -37.81844776554182, 144.95938672872117  
1          Unoccupied       10136    -37.8099909364941, 144.95263753679632  
2          Unoccupied        6527   -37.81060096851364, 144.95642622505966  
3          Unoccupied        6526  -37.810581463657826, 144.95649292476088  
4          Unoccupied        6497   -37.81044576734748, 144.95648958199024  
..                ...         ...                                      ...  
95            Present        5474   -37.81213407156074, 144.95951560000623  
96         Unoccupied        5479     -37.8124708174905, 144.9594171332239  
97            Present        5456  -37.812461443439034, 144.95953771840624  
98         Unoccupied        5455  -37.812485165969974, 144.95954853517475  
99            Present        5462  -37.812296656455715, 144.95946258243737  

[100 rows x 6 columns]

4.1. Visualization¶

Missing Data Visualization Missing data visualization involves identifying and understanding gaps in a dataset using graphical techniques such as heatmaps, bar plots, or matrix plots. These visuals highlight patterns and proportions of missing values across features, aiding in informed decisions for data cleaning and imputation strategies during preprocessing.

4.1.1. Heatmap¶

Display missing values across the dataset to identify patterns or areas where data is missing.

In [ ]:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Load the dataset from the CSV file
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
data = pd.read_csv(file_path)

# Display the first few rows and column names to inspect the data
print("Column names:", data.columns)
print("First few rows of the dataset:")
print(data.head())

# Identify missing values
missing_values = data.isnull().sum()

# Calculate the percentage of missing values
missing_percentage = (missing_values / len(data)) * 100

# Create a DataFrame to display missing values and their percentage
missing_data = pd.DataFrame({
    'Missing Values': missing_values,
    'Percentage of Missing Values (%)': missing_percentage
})

# Display the DataFrame with missing values information
print("Missing values information:")
print(missing_data)

# Create a heatmap for missing values
plt.figure(figsize=(12, 8))
sns.heatmap(data.isnull(), cbar=False, cmap='viridis', yticklabels=False, xticklabels=True)
plt.title('Heatmap of Missing Values')
plt.xlabel('Columns')
plt.ylabel('Rows')
plt.show()

4.1.2. Bar Plot¶

Show the percentage of missing data in each column to prioritize which columns need attention.

In [ ]:
import pandas as pd
import matplotlib.pyplot as plt

# Load the dataset from the CSV file
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
data = pd.read_csv(file_path)

# Identify missing values
missing_values = data.isnull().sum()

# Calculate the percentage of missing values
missing_percentage = (missing_values / len(data)) * 100

# Create a DataFrame to display missing values and their percentage
missing_data = pd.DataFrame({
    'Missing Values': missing_values,
    'Percentage of Missing Values (%)': missing_percentage
})

# Display the DataFrame with missing values information
print("Missing values information:")
print(missing_data)

# Plot the percentage of missing values as a bar plot
plt.figure(figsize=(12, 8))
missing_data['Percentage of Missing Values (%)'].sort_values().plot(kind='barh', color='skyblue')
plt.title('Percentage of Missing Data in Each Column')
plt.xlabel('Percentage of Missing Values (%)')
plt.ylabel('Columns')
plt.show()

4.2. Hourly Parking Entry and Exit Analysis Using Histograms¶

In this code, I created histograms to visualize entry and exit trends in parking data, displaying the distribution of parking entries and exits per hour. These histograms help identify peak hours, understand user parking behavior, and analyze patterns, providing insights into periods of high and low parking activity for better decision-making.

In [ ]:
import pandas as pd
import pytz


file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv' 
df = pd.read_csv(file_path)

# List the column names
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    utc_zone = pytz.utc
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    
    # Convert the string to a datetime object
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    
    # Convert to Melbourne time
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# List missing values
print("\nMissing Values:")
print(df.isnull().sum())

# Fill missing values with values from other columns/rows
# use forward fill and backward fill 
df.fillna(method='ffill', inplace=True)  # Forward fill
df.fillna(method='bfill', inplace=True)  # Backward fill

# Recheck missing values
print("\nMissing Values After Filling:")
print(df.isnull().sum())

# Calculate the parking time
if 'Lastupdated' in df.columns and 'Status_Timestamp' in df.columns:
    df['parking_time'] = (df['Lastupdated'] - df['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes
    print("\nDataFrame with Parking Time:")
    print(df[['Lastupdated', 'Status_Timestamp', 'parking_time']].head())
else:
    print("Required columns for parking time calculation are missing.")

4.3. Comprehensive Parking Data Analysis with Timezone Conversion and Entry/Exit Trends Visualization¶

In this code, I performed a comprehensive analysis of parking data. The dataset was loaded and column names listed for clarity. A timezone conversion function was implemented to standardize timestamps from UTC to Melbourne time. Missing values were identified and handled using forward and backward filling methods to ensure data completeness. Parking time was calculated by subtracting timestamps, enabling detailed temporal analysis. Additionally, entry and exit trends were analyzed by grouping data based on hours and plotting histograms for visualization. These steps provided insights into hourly parking behavior, aiding in understanding peak usage times and optimizing parking management.

In [46]:
import pandas as pd
import pytz
import matplotlib.pyplot as plt

# Load the dataset
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
df = pd.read_csv(file_path)

# List the column names
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    utc_zone = pytz.utc
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    
    # Convert the string to a datetime object
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    
    # Convert to Melbourne time
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# List missing values
print("\nMissing Values:")
print(df.isnull().sum())

# Fill missing values with values from other columns/rows
df.fillna(method='ffill', inplace=True)  # Forward fill
df.fillna(method='bfill', inplace=True)  # Backward fill

# Recheck missing values
print("\nMissing Values After Filling:")
print(df.isnull().sum())

# Calculate the parking time
if 'Lastupdated' in df.columns and 'Status_Timestamp' in df.columns:
    df['parking_time'] = (df['Lastupdated'] - df['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes
    print("\nDataFrame with Parking Time:")
    print(df[['Lastupdated', 'Status_Timestamp', 'parking_time']].head())
else:
    print("Required columns for parking time calculation are missing.")

# Extract the hour from Status_Timestamp
df['Hour'] = df['Status_Timestamp'].dt.hour

# Assuming 'Status_Description' has values 'Occupied' and 'Vacant' for entries and exits
entries_per_hour = df[df['Status_Description'] == 'Unoccupied'].groupby('Hour').size()
exits_per_hour = df[df['Status_Description'] == 'Present'].groupby('Hour').size()

# Plot histograms for Entries and Exits
plt.figure(figsize=(14, 6))

# Plot for Entries
plt.subplot(1, 2, 1)
entries_per_hour.plot(kind='bar', color='coral')
plt.title('Parking Entries Per Hour')
plt.xlabel('Hour of the Day')
plt.ylabel('Number of Entries')

# Plot for Exits
plt.subplot(1, 2, 2)
exits_per_hour.plot(kind='bar', color='lightgreen')
plt.title('Parking Exits Per Hour')
plt.xlabel('Hour of the Day')
plt.ylabel('Number of Exits')

plt.tight_layout()
plt.show()
Column Names:
['Lastupdated', 'Status_Timestamp', 'Zone_Number', 'Status_Description', 'KerbsideID', 'Location']
Updated Column: Lastupdated
Updated Column: Status_Timestamp

Missing Values:
Lastupdated             0
Status_Timestamp        0
Zone_Number           501
Status_Description      0
KerbsideID              0
Location                0
dtype: int64

Missing Values After Filling:
Lastupdated           0
Status_Timestamp      0
Zone_Number           0
Status_Description    0
KerbsideID            0
Location              0
dtype: int64

DataFrame with Parking Time:
                Lastupdated          Status_Timestamp  parking_time
0 2023-12-14 15:45:34+11:00 2023-12-14 14:41:25+11:00     64.150000
1 2023-12-14 15:45:34+11:00 2023-12-13 17:21:58+11:00   1343.600000
2 2023-12-15 10:45:34+11:00 2023-12-15 10:35:02+11:00     10.533333
3 2023-12-15 10:45:34+11:00 2023-12-15 09:39:46+11:00     65.800000
4 2023-12-18 15:45:34+11:00 2023-12-18 10:47:54+11:00    297.666667
C:\Users\ssgul\AppData\Local\Temp\ipykernel_10488\2908851115.py:41: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='ffill', inplace=True)  # Forward fill
C:\Users\ssgul\AppData\Local\Temp\ipykernel_10488\2908851115.py:42: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='bfill', inplace=True)  # Backward fill
No description has been provided for this image

4.4.Rolling Averages and Resampling for Parking Status Analysis¶

In this code, I performed an in-depth analysis of parking status trends by resampling the data to an hourly frequency. The dataset was loaded, and timestamps were converted to Melbourne time for accurate temporal analysis. I calculated the number of occupied parking bays per hour Status_Description and the mean parking time. A rolling average with a 24-hour window was computed to smooth fluctuations and reveal overall trends in parking occupancy. Additionally, histograms were plotted to visualize entry and exit trends, while line plots illustrated hourly occupied bays and their rolling averages, providing insights into peak and consistent usage periods.

In [20]:
import pandas as pd
import pytz
import matplotlib.pyplot as plt

# Load the dataset
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
df = pd.read_csv(file_path)

# List the column names
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    utc_zone = pytz.utc
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    
    # Convert the string to a datetime object
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    
    # Convert to Melbourne time
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# List missing values
print("\nMissing Values:")
print(df.isnull().sum())

# Fill missing values with values from other columns/rows
df.fillna(method='ffill', inplace=True)  # Forward fill
df.fillna(method='bfill', inplace=True)  # Backward fill

# Recheck missing values
print("\nMissing Values After Filling:")
print(df.isnull().sum())

# Calculate the parking time
if 'Lastupdated' in df.columns and 'Status_Timestamp' in df.columns:
    df['parking_time'] = (df['Lastupdated'] - df['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes
    print("\nDataFrame with Parking Time:")
    print(df[['Lastupdated', 'Status_Timestamp', 'parking_time']].head())
else:
    print("Required columns for parking time calculation are missing.")

# Set 'Status_Timestamp' as the index and ensure it is in datetime format
df.set_index('Status_Timestamp', inplace=True)

# Resample data to hourly frequency
df_hourly = df.resample('H').agg({
    'Status_Description': lambda x: (x == 'Present').sum(),  # Count 'Occupied' status
    'parking_time': 'mean'  # Average parking time
})

# Calculate rolling averages with a 24-hour window
df_hourly['Occupied_Rolling_Avg'] = df_hourly['Status_Description'].rolling(window=24).mean()

# Extract the hour from Status_Timestamp for histogram plotting
df['Hour'] = df.index.hour

# Assuming 'Status_Description' has values 'Occupied' and 'Vacant' for entries and exits
entries_per_hour = df[df['Status_Description'] == 'Unoccupied'].groupby('Hour').size()
exits_per_hour = df[df['Status_Description'] == 'Present'].groupby('Hour').size()

# Plot histograms for Entries and Exits
plt.figure(figsize=(14, 6))

# Plot for Entries
plt.subplot(1, 2, 1)
entries_per_hour.plot(kind='bar', color='coral')
plt.title('Parking Entries Per Hour')
plt.xlabel('Hour of the Day')
plt.ylabel('Number of Entries')

# Plot for Exits
plt.subplot(1, 2, 2)
exits_per_hour.plot(kind='bar', color='lightgreen')
plt.title('Parking Exits Per Hour')
plt.xlabel('Hour of the Day')
plt.ylabel('Number of Exits')

plt.tight_layout()
plt.show()

# Plot rolling averages
plt.figure(figsize=(14, 7))

# Plot number of occupied statuses per hour
plt.subplot(2, 1, 1)
df_hourly['Status_Description'].plot(title='Hourly Number of Occupied Parking Bays', color='coral')
plt.xlabel('Date and Time')
plt.ylabel('Number of Occupied Bays')

# Plot rolling average of occupied statuses
plt.subplot(2, 1, 2)
df_hourly['Occupied_Rolling_Avg'].plot(title='24-Hour Rolling Average of Occupied Parking Bays', color='lightgreen')
plt.xlabel('Date and Time')
plt.ylabel('Rolling Average of Occupied Bays')

plt.tight_layout()
plt.show()
Column Names:
['Lastupdated', 'Status_Timestamp', 'Zone_Number', 'Status_Description', 'KerbsideID', 'Location']
Updated Column: Lastupdated
Updated Column: Status_Timestamp

Missing Values:
Lastupdated             0
Status_Timestamp        0
Zone_Number           501
Status_Description      0
KerbsideID              0
Location                0
dtype: int64

Missing Values After Filling:
Lastupdated           0
Status_Timestamp      0
Zone_Number           0
Status_Description    0
KerbsideID            0
Location              0
dtype: int64

DataFrame with Parking Time:
                Lastupdated          Status_Timestamp  parking_time
0 2023-12-14 15:45:34+11:00 2023-12-14 14:41:25+11:00     64.150000
1 2023-12-14 15:45:34+11:00 2023-12-13 17:21:58+11:00   1343.600000
2 2023-12-15 10:45:34+11:00 2023-12-15 10:35:02+11:00     10.533333
3 2023-12-15 10:45:34+11:00 2023-12-15 09:39:46+11:00     65.800000
4 2023-12-18 15:45:34+11:00 2023-12-18 10:47:54+11:00    297.666667
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\2658901350.py:41: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='ffill', inplace=True)  # Forward fill
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\2658901350.py:42: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='bfill', inplace=True)  # Backward fill
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\2658901350.py:60: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.
  df_hourly = df.resample('H').agg({
No description has been provided for this image
No description has been provided for this image

4.5. Timezone Conversion and Parking Behavior Analysis¶

This code processes parking sensor data to analyze parking behavior over time. It begins by loading the dataset and converting timestamps from UTC to Melbourne time for accurate local analysis. Columns are filtered to focus on early 2024 data, and missing values are filled using forward and backward filling techniques. Parking time is calculated in minutes, and data is resampled to an hourly frequency. Rolling averages are computed to observe long-term trends, while histograms visualize parking entries and exits. Line plots display hourly occupancy counts and 24-hour rolling averages, revealing patterns and peak periods in parking utilization.

In [21]:
import pandas as pd
import pytz
import matplotlib.pyplot as plt

# Load the dataset
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
df = pd.read_csv(file_path)

# List the column names
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    utc_zone = pytz.utc
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    
    # Convert the string to a datetime object
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    
    # Convert to Melbourne time
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Filter data to include only rows up to August 2024
df = df[(df['Status_Timestamp'].dt.year == 2024) & (df['Status_Timestamp'].dt.month <= 2)]

# List missing values
print("\nMissing Values:")
print(df.isnull().sum())

# Fill missing values with values from other columns/rows
df.fillna(method='ffill', inplace=True)  # Forward fill
df.fillna(method='bfill', inplace=True)  # Backward fill

# Recheck missing values
print("\nMissing Values After Filling:")
print(df.isnull().sum())

# Calculate the parking time
if 'Lastupdated' in df.columns and 'Status_Timestamp' in df.columns:
    df['parking_time'] = (df['Lastupdated'] - df['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes
    print("\nDataFrame with Parking Time:")
    print(df[['Lastupdated', 'Status_Timestamp', 'parking_time']].head())
else:
    print("Required columns for parking time calculation are missing.")

# Set 'Status_Timestamp' as the index and ensure it is in datetime format
df.set_index('Status_Timestamp', inplace=True)

# Resample data to hourly frequency
df_hourly = df.resample('H').agg({
    'Status_Description': lambda x: (x == 'Present').sum(),  # Count 'Occupied' status
    'parking_time': 'mean'  # Average parking time
})

# Calculate rolling averages with a 24-hour window
df_hourly['Occupied_Rolling_Avg'] = df_hourly['Status_Description'].rolling(window=24).mean()

# Extract the hour from Status_Timestamp for histogram plotting
df['Hour'] = df.index.hour

# Assuming 'Status_Description' has values 'Occupied' and 'Vacant' for entries and exits
entries_per_hour = df[df['Status_Description'] == 'Unoccupied'].groupby('Hour').size()
exits_per_hour = df[df['Status_Description'] == 'Present'].groupby('Hour').size()

# Plot histograms for Entries and Exits
plt.figure(figsize=(14, 6))

# Plot for Entries
plt.subplot(1, 2, 1)
entries_per_hour.plot(kind='bar', color='coral')
plt.title('Parking Entries Per Hour')
plt.xlabel('Hour of the Day')
plt.ylabel('Number of Entries')

# Plot for Exits
plt.subplot(1, 2, 2)
exits_per_hour.plot(kind='bar', color='lightgreen')
plt.title('Parking Exits Per Hour')
plt.xlabel('Hour of the Day')
plt.ylabel('Number of Exits')

plt.tight_layout()
plt.show()

# Plot rolling averages
plt.figure(figsize=(14, 7))

# Plot number of occupied statuses per hour
plt.subplot(2, 1, 1)
df_hourly['Status_Description'].plot(title='Hourly Number of Occupied Parking Bays', color='coral')
plt.xlabel('Date and Time')
plt.ylabel('Number of Occupied Bays')

# Plot rolling average of occupied statuses
plt.subplot(2, 1, 2)
df_hourly['Occupied_Rolling_Avg'].plot(title='24-Hour Rolling Average of Occupied Parking Bays', color='lightgreen')
plt.xlabel('Date and Time')
plt.ylabel('Rolling Average of Occupied Bays')

plt.tight_layout()
plt.show()
Column Names:
['Lastupdated', 'Status_Timestamp', 'Zone_Number', 'Status_Description', 'KerbsideID', 'Location']
Updated Column: Lastupdated
Updated Column: Status_Timestamp

Missing Values:
Lastupdated            0
Status_Timestamp       0
Zone_Number           83
Status_Description     0
KerbsideID             0
Location               0
dtype: int64

Missing Values After Filling:
Lastupdated           0
Status_Timestamp      0
Zone_Number           0
Status_Description    0
KerbsideID            0
Location              0
dtype: int64

DataFrame with Parking Time:
                  Lastupdated          Status_Timestamp  parking_time
764 2024-01-22 12:45:34+11:00 2024-01-20 02:10:46+11:00   3514.800000
765 2024-01-22 12:45:34+11:00 2024-01-13 16:11:01+11:00  12754.550000
766 2024-01-22 12:45:34+11:00 2024-01-13 18:51:45+11:00  12593.816667
767 2024-01-22 12:45:34+11:00 2024-01-13 17:02:07+11:00  12703.450000
768 2024-01-22 12:45:34+11:00 2024-01-13 17:41:19+11:00  12664.250000
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\2803192120.py:44: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='ffill', inplace=True)  # Forward fill
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\2803192120.py:45: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='bfill', inplace=True)  # Backward fill
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\2803192120.py:63: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.
  df_hourly = df.resample('H').agg({
No description has been provided for this image
No description has been provided for this image

4.6.Parking Entry Exit Analysis & Visualization¶

This code processes parking data to analyze trends. It converts timestamps to Melbourne time, filters February 2024 data, fills missing values, and calculates parking time in minutes. Data is resampled hourly, rolling averages are computed for occupied bays, and parking entries/exits are analyzed. Visualizations include line graphs for hourly trends and rolling averages, revealing peak usage periods and behavioral patterns.

In [22]:
import pandas as pd
import pytz
import matplotlib.pyplot as plt

# Load the dataset
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
df = pd.read_csv(file_path)

# List the column names
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    utc_zone = pytz.utc
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    
    # Convert the string to a datetime object
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    
    # Convert to Melbourne time
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Filter data to include only rows in Feb 2024
df = df[(df['Status_Timestamp'].dt.year == 2024) & (df['Status_Timestamp'].dt.month == 2)]

# List missing values
print("\nMissing Values:")
print(df.isnull().sum())

# Fill missing values with values from other columns/rows
df.fillna(method='ffill', inplace=True)  # Forward fill
df.fillna(method='bfill', inplace=True)  # Backward fill

# Recheck missing values
print("\nMissing Values After Filling:")
print(df.isnull().sum())

# Calculate the parking time
if 'Lastupdated' in df.columns and 'Status_Timestamp' in df.columns:
    df['parking_time'] = (df['Lastupdated'] - df['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes
    print("\nDataFrame with Parking Time:")
    print(df[['Lastupdated', 'Status_Timestamp', 'parking_time']].head())
else:
    print("Required columns for parking time calculation are missing.")

# Set 'Status_Timestamp' as the index and ensure it is in datetime format
df.set_index('Status_Timestamp', inplace=True)

# Resample data to hourly frequency
df_hourly = df.resample('H').agg({
    'Status_Description': lambda x: (x == 'Present').sum(),  # Count 'Occupied' status
    'parking_time': 'mean'  # Average parking time
})

# Calculate rolling averages with a 24-hour window
df_hourly['Occupied_Rolling_Avg'] = df_hourly['Status_Description'].rolling(window=24).mean()

# Extract the hour from Status_Timestamp for histogram plotting
df['Hour'] = df.index.hour

# Calculate hourly parking entries and exits
entries_per_hour = df[df['Status_Description'] == 'Unoccupied'].groupby('Hour').size()
exits_per_hour = df[df['Status_Description'] == 'Present'].groupby('Hour').size()

# Plot line graphs for Entries and Exits over time
plt.figure(figsize=(14, 6))

# Plot for Entries over time
plt.subplot(2, 1, 1)
entries_per_hour.plot(kind='line', color='blue', marker='o', linestyle='-', linewidth=2)
plt.title('Parking Entries Per Hour')
plt.xlabel('Hour of the Day')
plt.ylabel('Number of Entries')

# Plot for Exits over time
plt.subplot(2, 1, 2)
exits_per_hour.plot(kind='line', color='red', marker='o', linestyle='-', linewidth=2)
plt.title('Parking Exits Per Hour')
plt.xlabel('Hour of the Day')
plt.ylabel('Number of Exits')

plt.tight_layout()
plt.show()

# Plot rolling averages using line graph
plt.figure(figsize=(14, 7))

# Plot number of occupied statuses per hour
plt.subplot(2, 1, 1)
df_hourly['Status_Description'].plot(kind='line', color='purple', linestyle='-', linewidth=2)
plt.title('Hourly Number of Occupied Parking Bays')
plt.xlabel('Date and Time')
plt.ylabel('Number of Occupied Bays')

# Plot rolling average of occupied statuses
plt.subplot(2, 1, 2)
df_hourly['Occupied_Rolling_Avg'].plot(kind='line', color='green', linestyle='-', linewidth=2)
plt.title('24-Hour Rolling Average of Occupied Parking Bays')
plt.xlabel('Date and Time')
plt.ylabel('Rolling Average of Occupied Bays')

plt.tight_layout()
plt.show()
Column Names:
['Lastupdated', 'Status_Timestamp', 'Zone_Number', 'Status_Description', 'KerbsideID', 'Location']
Updated Column: Lastupdated
Updated Column: Status_Timestamp

Missing Values:
Lastupdated            0
Status_Timestamp       0
Zone_Number           51
Status_Description     0
KerbsideID             0
Location               0
dtype: int64

Missing Values After Filling:
Lastupdated           0
Status_Timestamp      0
Zone_Number           0
Status_Description    0
KerbsideID            0
Location              0
dtype: int64

DataFrame with Parking Time:
                  Lastupdated          Status_Timestamp  parking_time
924 2024-02-08 14:45:34+11:00 2024-02-07 11:41:48+11:00   1623.766667
925 2024-02-08 14:45:34+11:00 2024-02-07 11:37:42+11:00   1627.866667
926 2024-02-08 14:45:34+11:00 2024-02-05 10:05:52+11:00   4599.700000
927 2024-02-08 14:45:34+11:00 2024-02-08 13:43:55+11:00     61.650000
928 2024-02-08 14:45:34+11:00 2024-02-08 08:06:24+11:00    399.166667
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\2357228162.py:44: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='ffill', inplace=True)  # Forward fill
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\2357228162.py:45: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='bfill', inplace=True)  # Backward fill
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\2357228162.py:63: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.
  df_hourly = df.resample('H').agg({
No description has been provided for this image
No description has been provided for this image

4.7. Parking Behaviour Analysis¶

2024 Montly Parking Details - Graphs - January to August - averages of each month - annual analysis

In [23]:
import pandas as pd
import pytz
import matplotlib.pyplot as plt

# Load the dataset
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
df = pd.read_csv(file_path)

# List the column names
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    utc_zone = pytz.utc
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    
    # Convert the string to a datetime object
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    
    # Convert to Melbourne time
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Filter data to include only rows from January to August 2024
df = df[(df['Status_Timestamp'].dt.year == 2024) & (df['Status_Timestamp'].dt.month <= 8)]

# List missing values
print("\nMissing Values:")
print(df.isnull().sum())

# Fill missing values with values from other columns/rows
df.fillna(method='ffill', inplace=True)  # Forward fill
df.fillna(method='bfill', inplace=True)  # Backward fill

# Recheck missing values
print("\nMissing Values After Filling:")
print(df.isnull().sum())

# Calculate the parking time
if 'Lastupdated' in df.columns and 'Status_Timestamp' in df.columns:
    df['parking_time'] = (df['Lastupdated'] - df['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes
    print("\nDataFrame with Parking Time:")
    print(df[['Lastupdated', 'Status_Timestamp', 'parking_time']].head())
else:
    print("Required columns for parking time calculation are missing.")

# Set 'Status_Timestamp' as the index and ensure it is in datetime format
df.set_index('Status_Timestamp', inplace=True)

# Resample data to monthly frequency to find the average
df_monthly = df.resample('M').agg({
    'Status_Description': lambda x: (x == 'Present').sum(),  # Count 'Occupied' status
    'parking_time': 'mean'  # Average parking time
})

# Plot monthly averages
plt.figure(figsize=(14, 7))

# Plot number of occupied statuses per month
plt.subplot(2, 1, 1)
df_monthly['Status_Description'].plot(title='Monthly Number of Occupied Parking Bays', color='coral')
plt.xlabel('Month')
plt.ylabel('Number of Occupied Bays')

# Plot average parking time per month
plt.subplot(2, 1, 2)
df_monthly['parking_time'].plot(title='Monthly Average Parking Time', color='lightgreen')
plt.xlabel('Month')
plt.ylabel('Average Parking Time (Minutes)')

plt.tight_layout()
plt.show()
Column Names:
['Lastupdated', 'Status_Timestamp', 'Zone_Number', 'Status_Description', 'KerbsideID', 'Location']
Updated Column: Lastupdated
Updated Column: Status_Timestamp

Missing Values:
Lastupdated             0
Status_Timestamp        0
Zone_Number           345
Status_Description      0
KerbsideID              0
Location                0
dtype: int64

Missing Values After Filling:
Lastupdated           0
Status_Timestamp      0
Zone_Number           0
Status_Description    0
KerbsideID            0
Location              0
dtype: int64

DataFrame with Parking Time:
                  Lastupdated          Status_Timestamp  parking_time
764 2024-01-22 12:45:34+11:00 2024-01-20 02:10:46+11:00   3514.800000
765 2024-01-22 12:45:34+11:00 2024-01-13 16:11:01+11:00  12754.550000
766 2024-01-22 12:45:34+11:00 2024-01-13 18:51:45+11:00  12593.816667
767 2024-01-22 12:45:34+11:00 2024-01-13 17:02:07+11:00  12703.450000
768 2024-01-22 12:45:34+11:00 2024-01-13 17:41:19+11:00  12664.250000
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\3669194813.py:44: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='ffill', inplace=True)  # Forward fill
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\3669194813.py:45: FutureWarning: DataFrame.fillna with 'method' is deprecated and will raise in a future version. Use obj.ffill() or obj.bfill() instead.
  df.fillna(method='bfill', inplace=True)  # Backward fill
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\3669194813.py:63: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.
  df_monthly = df.resample('M').agg({
No description has been provided for this image

4.8. Correlation Analysis of Numeric Parking Dataset Features¶

This code performs a correlation analysis on numeric columns of a parking dataset. Time columns are converted to datetime, and Status_Description values are mapped to integers for analysis. Parking time in minutes is calculated, and non-numeric columns are excluded to create a numeric-only subset. A Pearson correlation matrix is computed to identify relationships between features. The results are visualized using a heatmap, highlighting feature correlations, and printed as a table for detailed inspection. This analysis aids in understanding key interactions between variables.

In [24]:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Load the dataset (Replace with your actual dataset path)
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
df = pd.read_csv(file_path)

# Convert relevant time columns to datetime (example)
df['Lastupdated'] = pd.to_datetime(df['Lastupdated'], utc=True)
df['Status_Timestamp'] = pd.to_datetime(df['Status_Timestamp'], utc=True)

# Replace 'Status_Description' field values
df['Status_Description'] = df['Status_Description'].map({'Present': 1, 'Unoccupied': 0})

# Example: Calculate the parking time in minutes
df['parking_time'] = (df['Lastupdated'] - df['Status_Timestamp']).dt.total_seconds() / 60

# Drop columns with non-numeric data or convert them to numeric as needed
# Keep the 'Status_Description' since it's now numeric
df_numeric = df.select_dtypes(include=[float, int])

# Include 'Status_Description' explicitly in case it's not picked up automatically
if 'Status_Description' in df.columns:
    df_numeric['Status_Description'] = df['Status_Description']

# Calculate the correlation matrix
corr_matrix = df_numeric.corr(method='pearson')

# Plot the correlation matrix using a heatmap
plt.figure(figsize=(12, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Correlation Matrix of All Numeric Columns in the Dataset')
plt.show()

# Print the correlation matrix as a table
print("\nCorrelation Matrix Table:")
print(corr_matrix)
No description has been provided for this image
Correlation Matrix Table:
                    Zone_Number  Status_Description  KerbsideID  parking_time
Zone_Number            1.000000           -0.075150    0.106434      0.010869
Status_Description    -0.075150            1.000000    0.053272     -0.045223
KerbsideID             0.106434            0.053272    1.000000     -0.036208
parking_time           0.010869           -0.045223   -0.036208      1.000000

4.9. Correlation Analysis Between predefined columns¶

In [25]:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Load the dataset (Replace with your actual dataset path)
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
df = pd.read_csv(file_path)

# Convert relevant time columns to datetime
df['Lastupdated'] = pd.to_datetime(df['Lastupdated'], utc=True)
df['Status_Timestamp'] = pd.to_datetime(df['Status_Timestamp'], utc=True)

# Replace 'Status_Description' field values with 1 for 'Present' and 0 for 'Unoccupied'
df['Status_Description'] = df['Status_Description'].map({'Present': 1, 'Unoccupied': 0})

# Convert datetime columns to numeric (e.g., timestamps in seconds) for correlation analysis
df['Lastupdated_numeric'] = df['Lastupdated'].apply(lambda x: x.timestamp())
df['Status_Timestamp_numeric'] = df['Status_Timestamp'].apply(lambda x: x.timestamp())

# Select relevant variables for correlation analysis
corr_columns = ['Lastupdated_numeric', 'Status_Timestamp_numeric', 'Zone_Number', 'Status_Description']
corr_data = df[corr_columns]

# Calculate the correlation matrix
corr_matrix = corr_data.corr(method='pearson')

# Plot the correlation matrix using a heatmap
plt.figure(figsize=(12, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Correlation Matrix of Selected Columns')
plt.show()

# Print the correlation matrix as a table
print("\nCorrelation Matrix Table:")
print(corr_matrix)
No description has been provided for this image
Correlation Matrix Table:
                          Lastupdated_numeric  Status_Timestamp_numeric  \
Lastupdated_numeric                  1.000000                  0.236253   
Status_Timestamp_numeric             0.236253                  1.000000   
Zone_Number                         -0.322617                 -0.077418   
Status_Description                   0.084447                  0.058615   

                          Zone_Number  Status_Description  
Lastupdated_numeric         -0.322617            0.084447  
Status_Timestamp_numeric    -0.077418            0.058615  
Zone_Number                  1.000000           -0.075150  
Status_Description          -0.075150            1.000000  

Interpretation for Highly Correlated Results

Lastupdated_numeric and Zone_Number: Correlation Coefficient: -0.322617 Interpretation: This moderate negative correlation suggests that there is an inverse relationship between the Lastupdated time and the Zone_Number. As the Zone_Number increases, the Lastupdated time tends to decrease (or is earlier). This might imply that certain zones are more frequently updated earlier than others, potentially due to differing traffic patterns or update priorities across different zones. Lastupdated_numeric and Status_Timestamp_numeric: Correlation Coefficient: 0.236253 Interpretation: While this is not a strong correlation, the positive relationship indicates that as the Status_Timestamp increases (i.e., later times), the Lastupdated time also tends to increase, though the relationship is weak. This makes sense since updates are likely to occur around the same time as status changes, but the relatively low correlation suggests there might be variability in how promptly updates follow status changes.

4.10. Parking prediction analysis for 2025, January to August¶

Updated to filter data up to December 2024. Forecast Using tensorflow(Time Series Forecasting): to forecast or to predict the future value over a period of time. Forecast for 8 months ahead, from January to August 2025. Plotting Forecast: Included a plot for both historical data and forecasted occupancy to visualize the prediction.

In [26]:
import pandas as pd
import pytz
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

# Load the dataset
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
df = pd.read_csv(file_path)

# List the column names
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Filter data to include only rows from January 2023 to August 2024
df = df[(df['Status_Timestamp'] >= '2023-01-01') & (df['Status_Timestamp'] <= '2024-08-31')]

# List missing values
print("\nMissing Values:")
print(df.isnull().sum())

# Fill missing values with values from other columns/rows
df.ffill(inplace=True)  # Forward fill
df.bfill(inplace=True)  # Backward fill

# Recheck missing values
print("\nMissing Values After Filling:")
print(df.isnull().sum())

# Calculate the parking time
if 'Lastupdated' in df.columns and 'Status_Timestamp' in df.columns:
    df['parking_time'] = (df['Lastupdated'] - df['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes
    print("\nDataFrame with Parking Time:")
    print(df[['Lastupdated', 'Status_Timestamp', 'parking_time']].head())
else:
    print("Required columns for parking time calculation are missing.")

# Set 'Status_Timestamp' as the index and ensure it is in datetime format
df.set_index('Status_Timestamp', inplace=True)

# Resample data to monthly frequency to find the average
df_monthly = df.resample('M').agg({
    'Status_Description': lambda x: (x == 'Present').sum(),  # Count 'Present' status
    'parking_time': 'mean'  # Average parking time
})

# Normalize the data
scaler = MinMaxScaler(feature_range=(0, 1))
df_monthly_scaled = scaler.fit_transform(df_monthly[['Status_Description']])

# Function to create dataset matrix
def create_dataset(dataset, look_back=1):
    X, Y = [], []
    for i in range(len(dataset) - look_back - 1):
        a = dataset[i:(i + look_back), 0]
        X.append(a)
        Y.append(dataset[i + look_back, 0])
    return np.array(X), np.array(Y)

# Prepare the dataset for LSTM
look_back = 1
X, Y = create_dataset(df_monthly_scaled, look_back)

# Reshape input to be [samples, time steps, features]
X = np.reshape(X, (X.shape[0], 1, X.shape[1]))

# Split into train and test sets
train_size = int(len(X) * 0.8)
test_size = len(X) - train_size
X_train, X_test = X[0:train_size], X[train_size:len(X)]
Y_train, Y_test = Y[0:train_size], Y[train_size:len(Y)]

# Build LSTM Model
model = Sequential()
model.add(LSTM(100, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

# Train the model
model.fit(X_train, Y_train, epochs=100, batch_size=1, verbose=2)

# Make predictions
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# Invert predictions to original scale
train_predict = scaler.inverse_transform(train_predict)
trainY = scaler.inverse_transform([Y_train])
test_predict = scaler.inverse_transform(test_predict)
testY = scaler.inverse_transform([Y_test])

# Calculate RMSE
train_score = np.sqrt(mean_squared_error(trainY[0], train_predict[:, 0]))
print(f'Train Score: {train_score:.2f} RMSE')
test_score = np.sqrt(mean_squared_error(testY[0], test_predict[:, 0]))
print(f'Test Score: {test_score:.2f} RMSE')

# Forecast for 8 months ahead (January to August 2025)
future_periods = 8
forecast = []
current_batch = df_monthly_scaled[-look_back:].reshape((1, 1, look_back))

for _ in range(future_periods):
    current_pred = model.predict(current_batch)[0]
    forecast.append(current_pred)
    current_batch = np.append(current_batch[:, :, 1:], [[current_pred]], axis=2)

# Invert forecast to original scale
forecast = scaler.inverse_transform(forecast)

# Create a date range for the forecast
forecast_index = pd.date_range(start='2025-01-01', periods=future_periods, freq='M')

# Plot historical and forecasted data
plt.figure(figsize=(14, 7))

# Plot number of occupied statuses per month with forecast
plt.plot(df_monthly.index, df_monthly['Status_Description'], label='Historical Data', color='coral')
plt.plot(forecast_index, forecast, label='Forecast for 2025', color='blue', linestyle='--')
plt.title('Monthly Number of Occupied Parking Bays with LSTM Forecast')
plt.xlabel('Month')
plt.ylabel('Number of Occupied Bays')
plt.legend()

plt.tight_layout()
plt.show()
Column Names:
['Lastupdated', 'Status_Timestamp', 'Zone_Number', 'Status_Description', 'KerbsideID', 'Location']
Updated Column: Lastupdated
Updated Column: Status_Timestamp

Missing Values:
Lastupdated             0
Status_Timestamp        0
Zone_Number           499
Status_Description      0
KerbsideID              0
Location                0
dtype: int64

Missing Values After Filling:
Lastupdated           0
Status_Timestamp      0
Zone_Number           0
Status_Description    0
KerbsideID            0
Location              0
dtype: int64

DataFrame with Parking Time:
                Lastupdated          Status_Timestamp  parking_time
0 2023-12-14 15:45:34+11:00 2023-12-14 14:41:25+11:00     64.150000
1 2023-12-14 15:45:34+11:00 2023-12-13 17:21:58+11:00   1343.600000
2 2023-12-15 10:45:34+11:00 2023-12-15 10:35:02+11:00     10.533333
3 2023-12-15 10:45:34+11:00 2023-12-15 09:39:46+11:00     65.800000
4 2023-12-18 15:45:34+11:00 2023-12-18 10:47:54+11:00    297.666667
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\1246668331.py:63: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.
  df_monthly = df.resample('M').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\keras\src\layers\rnn\rnn.py:204: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Epoch 1/100
14/14 - 2s - 121ms/step - loss: 8.2402e-04
Epoch 2/100
14/14 - 0s - 3ms/step - loss: 5.9491e-04
Epoch 3/100
14/14 - 0s - 4ms/step - loss: 5.1413e-04
Epoch 4/100
14/14 - 0s - 3ms/step - loss: 5.3170e-04
Epoch 5/100
14/14 - 0s - 3ms/step - loss: 5.4702e-04
Epoch 6/100
14/14 - 0s - 3ms/step - loss: 5.1917e-04
Epoch 7/100
14/14 - 0s - 3ms/step - loss: 4.9705e-04
Epoch 8/100
14/14 - 0s - 3ms/step - loss: 4.4965e-04
Epoch 9/100
14/14 - 0s - 3ms/step - loss: 4.3403e-04
Epoch 10/100
14/14 - 0s - 3ms/step - loss: 4.4424e-04
Epoch 11/100
14/14 - 0s - 3ms/step - loss: 4.3119e-04
Epoch 12/100
14/14 - 0s - 3ms/step - loss: 3.9682e-04
Epoch 13/100
14/14 - 0s - 3ms/step - loss: 3.9379e-04
Epoch 14/100
14/14 - 0s - 3ms/step - loss: 4.0816e-04
Epoch 15/100
14/14 - 0s - 3ms/step - loss: 3.9657e-04
Epoch 16/100
14/14 - 0s - 3ms/step - loss: 3.7955e-04
Epoch 17/100
14/14 - 0s - 4ms/step - loss: 3.2425e-04
Epoch 18/100
14/14 - 0s - 3ms/step - loss: 3.4099e-04
Epoch 19/100
14/14 - 0s - 3ms/step - loss: 3.2604e-04
Epoch 20/100
14/14 - 0s - 3ms/step - loss: 2.8949e-04
Epoch 21/100
14/14 - 0s - 3ms/step - loss: 3.0612e-04
Epoch 22/100
14/14 - 0s - 3ms/step - loss: 2.8594e-04
Epoch 23/100
14/14 - 0s - 3ms/step - loss: 3.0488e-04
Epoch 24/100
14/14 - 0s - 3ms/step - loss: 2.9801e-04
Epoch 25/100
14/14 - 0s - 3ms/step - loss: 2.9756e-04
Epoch 26/100
14/14 - 0s - 3ms/step - loss: 2.7224e-04
Epoch 27/100
14/14 - 0s - 3ms/step - loss: 2.9523e-04
Epoch 28/100
14/14 - 0s - 4ms/step - loss: 2.9957e-04
Epoch 29/100
14/14 - 0s - 3ms/step - loss: 3.0262e-04
Epoch 30/100
14/14 - 0s - 3ms/step - loss: 2.9783e-04
Epoch 31/100
14/14 - 0s - 3ms/step - loss: 2.7002e-04
Epoch 32/100
14/14 - 0s - 3ms/step - loss: 2.7360e-04
Epoch 33/100
14/14 - 0s - 3ms/step - loss: 2.7608e-04
Epoch 34/100
14/14 - 0s - 3ms/step - loss: 2.7131e-04
Epoch 35/100
14/14 - 0s - 3ms/step - loss: 2.6291e-04
Epoch 36/100
14/14 - 0s - 3ms/step - loss: 2.9143e-04
Epoch 37/100
14/14 - 0s - 3ms/step - loss: 3.0718e-04
Epoch 38/100
14/14 - 0s - 3ms/step - loss: 2.3999e-04
Epoch 39/100
14/14 - 0s - 3ms/step - loss: 3.1233e-04
Epoch 40/100
14/14 - 0s - 3ms/step - loss: 2.9977e-04
Epoch 41/100
14/14 - 0s - 3ms/step - loss: 2.8434e-04
Epoch 42/100
14/14 - 0s - 3ms/step - loss: 2.6717e-04
Epoch 43/100
14/14 - 0s - 3ms/step - loss: 2.7965e-04
Epoch 44/100
14/14 - 0s - 3ms/step - loss: 2.6927e-04
Epoch 45/100
14/14 - 0s - 3ms/step - loss: 2.7513e-04
Epoch 46/100
14/14 - 0s - 3ms/step - loss: 2.6644e-04
Epoch 47/100
14/14 - 0s - 3ms/step - loss: 2.6014e-04
Epoch 48/100
14/14 - 0s - 3ms/step - loss: 2.5524e-04
Epoch 49/100
14/14 - 0s - 3ms/step - loss: 2.9532e-04
Epoch 50/100
14/14 - 0s - 3ms/step - loss: 2.8774e-04
Epoch 51/100
14/14 - 0s - 3ms/step - loss: 2.6282e-04
Epoch 52/100
14/14 - 0s - 3ms/step - loss: 2.4850e-04
Epoch 53/100
14/14 - 0s - 3ms/step - loss: 2.6639e-04
Epoch 54/100
14/14 - 0s - 3ms/step - loss: 2.6202e-04
Epoch 55/100
14/14 - 0s - 3ms/step - loss: 2.6647e-04
Epoch 56/100
14/14 - 0s - 3ms/step - loss: 2.6393e-04
Epoch 57/100
14/14 - 0s - 3ms/step - loss: 2.6421e-04
Epoch 58/100
14/14 - 0s - 3ms/step - loss: 2.5835e-04
Epoch 59/100
14/14 - 0s - 3ms/step - loss: 2.5529e-04
Epoch 60/100
14/14 - 0s - 3ms/step - loss: 2.8976e-04
Epoch 61/100
14/14 - 0s - 3ms/step - loss: 3.0669e-04
Epoch 62/100
14/14 - 0s - 3ms/step - loss: 2.5925e-04
Epoch 63/100
14/14 - 0s - 3ms/step - loss: 2.7589e-04
Epoch 64/100
14/14 - 0s - 3ms/step - loss: 2.7335e-04
Epoch 65/100
14/14 - 0s - 3ms/step - loss: 2.6351e-04
Epoch 66/100
14/14 - 0s - 3ms/step - loss: 2.8255e-04
Epoch 67/100
14/14 - 0s - 3ms/step - loss: 2.6385e-04
Epoch 68/100
14/14 - 0s - 3ms/step - loss: 2.6438e-04
Epoch 69/100
14/14 - 0s - 3ms/step - loss: 2.6038e-04
Epoch 70/100
14/14 - 0s - 3ms/step - loss: 2.7917e-04
Epoch 71/100
14/14 - 0s - 3ms/step - loss: 2.5851e-04
Epoch 72/100
14/14 - 0s - 3ms/step - loss: 2.7088e-04
Epoch 73/100
14/14 - 0s - 3ms/step - loss: 2.8136e-04
Epoch 74/100
14/14 - 0s - 3ms/step - loss: 2.6881e-04
Epoch 75/100
14/14 - 0s - 3ms/step - loss: 2.6537e-04
Epoch 76/100
14/14 - 0s - 3ms/step - loss: 2.7531e-04
Epoch 77/100
14/14 - 0s - 3ms/step - loss: 2.5727e-04
Epoch 78/100
14/14 - 0s - 3ms/step - loss: 2.5993e-04
Epoch 79/100
14/14 - 0s - 3ms/step - loss: 2.6193e-04
Epoch 80/100
14/14 - 0s - 3ms/step - loss: 3.0524e-04
Epoch 81/100
14/14 - 0s - 3ms/step - loss: 2.9879e-04
Epoch 82/100
14/14 - 0s - 3ms/step - loss: 2.8153e-04
Epoch 83/100
14/14 - 0s - 3ms/step - loss: 2.9227e-04
Epoch 84/100
14/14 - 0s - 3ms/step - loss: 2.6371e-04
Epoch 85/100
14/14 - 0s - 3ms/step - loss: 2.8297e-04
Epoch 86/100
14/14 - 0s - 3ms/step - loss: 2.8731e-04
Epoch 87/100
14/14 - 0s - 3ms/step - loss: 2.7110e-04
Epoch 88/100
14/14 - 0s - 3ms/step - loss: 2.5809e-04
Epoch 89/100
14/14 - 0s - 3ms/step - loss: 2.7292e-04
Epoch 90/100
14/14 - 0s - 3ms/step - loss: 3.1106e-04
Epoch 91/100
14/14 - 0s - 3ms/step - loss: 2.5719e-04
Epoch 92/100
14/14 - 0s - 3ms/step - loss: 2.7058e-04
Epoch 93/100
14/14 - 0s - 3ms/step - loss: 2.9858e-04
Epoch 94/100
14/14 - 0s - 3ms/step - loss: 2.6134e-04
Epoch 95/100
14/14 - 0s - 3ms/step - loss: 2.9380e-04
Epoch 96/100
14/14 - 0s - 3ms/step - loss: 2.6776e-04
Epoch 97/100
14/14 - 0s - 3ms/step - loss: 2.6106e-04
Epoch 98/100
14/14 - 0s - 3ms/step - loss: 2.7766e-04
Epoch 99/100
14/14 - 0s - 3ms/step - loss: 2.5907e-04
Epoch 100/100
14/14 - 0s - 3ms/step - loss: 2.6257e-04
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 155ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 248ms/step
Train Score: 40.21 RMSE
Test Score: 112.93 RMSE
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
C:\Users\ssgul\AppData\Local\Temp\ipykernel_8872\1246668331.py:133: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.
  forecast_index = pd.date_range(start='2025-01-01', periods=future_periods, freq='M')
No description has been provided for this image

4.12. Comparison- parking slots need for 2025 based on 2024. - Forecasting¶

This code forecasts parking occupancy trends using LSTM. It preprocesses parking data by converting timestamps to Melbourne time, filtering for January-August 2024, and calculating parking time. The data is resampled hourly, normalized, and structured for LSTM input. An LSTM model is trained on 80% of the data, and predictions are made for testing and future periods. The model forecasts hourly occupancy from January-August 2025, converting predictions back to original scale and aggregating monthly values. Results are visualized, comparing 2024 data to 2025 forecasts, and displayed in a summary table for clear insights into parking trends.

In [29]:
import pandas as pd
import pytz
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

# Load the dataset
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
df = pd.read_csv(file_path)

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# List of columns to convert
columns_to_convert = ['Lastupdated', 'Status_Timestamp']

# Convert the specified columns
for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)

# Filter data to include only rows from January 2024 to August 2024
df_2024 = df[(df['Status_Timestamp'] >= '2024-01-01') & (df['Status_Timestamp'] <= '2024-08-31')]

# Calculate the parking time
df_2024['parking_time'] = (df_2024['Lastupdated'] - df_2024['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes

# Set 'Status_Timestamp' as the index and ensure it is in datetime format
df_2024.set_index('Status_Timestamp', inplace=True)

# Resample data to hourly frequency to find the average
df_hourly_2024 = df_2024.resample('H').agg({
    'Status_Description': lambda x: (x == 'Present').sum(),  # Count 'Present' status
    'parking_time': 'mean'  # Average parking time
})

# Replace negative results with zero
df_hourly_2024['Status_Description'] = df_hourly_2024['Status_Description'].clip(lower=0)

# Normalize the data
scaler = MinMaxScaler(feature_range=(0, 1))
df_hourly_scaled_2024 = scaler.fit_transform(df_hourly_2024[['Status_Description']])

# Function to create dataset matrix
def create_dataset(dataset, look_back=1):
    X, Y = [], []
    for i in range(len(dataset) - look_back - 1):
        a = dataset[i:(i + look_back), 0]
        X.append(a)
        Y.append(dataset[i + look_back, 0])
    return np.array(X), np.array(Y)

# Prepare the dataset for LSTM
look_back = 1
X, Y = create_dataset(df_hourly_scaled_2024, look_back)

# Reshape input to be [samples, time steps, features]
X = np.reshape(X, (X.shape[0], 1, X.shape[1]))

# Split into train and test sets
train_size = int(len(X) * 0.8)
test_size = len(X) - train_size
X_train, X_test = X[0:train_size], X[train_size:len(X)]
Y_train, Y_test = Y[0:train_size], Y[train_size:len(Y)]

# Build LSTM Model
model = Sequential()
model.add(LSTM(100, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

# Train the model
model.fit(X_train, Y_train, epochs=100, batch_size=1, verbose=2)

# Make predictions
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# Invert predictions to original scale
train_predict = scaler.inverse_transform(train_predict)
trainY = scaler.inverse_transform([Y_train])
test_predict = scaler.inverse_transform(test_predict)
testY = scaler.inverse_transform([Y_test])

# Calculate RMSE
train_score = np.sqrt(mean_squared_error(trainY[0], train_predict[:, 0]))
print(f'Train Score: {train_score:.2f} RMSE')
test_score = np.sqrt(mean_squared_error(testY[0], test_predict[:, 0]))
print(f'Test Score: {test_score:.2f} RMSE')

# Forecast for 8 months ahead (January to August 2025)
future_periods = 8 * 30 * 24  # 8 months worth of hourly predictions
forecast = []
current_batch = df_hourly_scaled_2024[-look_back:].reshape((1, 1, look_back))

for _ in range(future_periods):
    current_pred = model.predict(current_batch)[0]
    forecast.append(current_pred)
    current_batch = np.append(current_batch[:, :, 1:], [[current_pred]], axis=2)

# Invert forecast to original scale
forecast = scaler.inverse_transform(forecast)

# Replace negative forecasted values with zero
forecast[forecast < 0] = 0

# Resample the forecast to monthly frequency
forecast_df = pd.DataFrame(forecast, index=pd.date_range(start='2025-01-01', periods=future_periods, freq='H'))
forecast_monthly = forecast_df.resample('M').sum()

# Plot historical and forecasted data
plt.figure(figsize=(14, 7))

# Plot number of occupied statuses per month with forecast
df_hourly_2024_monthly = df_hourly_2024['Status_Description'].resample('M').sum()
plt.plot(df_hourly_2024_monthly.index, df_hourly_2024_monthly, label='2024 Data (Jan-Aug)', color='coral')
plt.plot(forecast_monthly.index, forecast_monthly, label='Forecast for 2025 (Jan-Aug)', color='blue', linestyle='--')
plt.title('Monthly Number of Occupied Parking Bays (Hourly Analysis) with LSTM Forecast')
plt.xlabel('Month')
plt.ylabel('Number of Occupied Bays')
plt.legend()

plt.tight_layout()
plt.show()

# Display results in a table
forecast_table = pd.DataFrame({
    'Month': forecast_monthly.index.strftime('%Y-%m'),
    'Forecasted Occupied Bays (2025)': forecast_monthly.values.flatten(),
    'Actual Occupied Bays (2024)': df_hourly_2024_monthly.values
})
print("\nForecasted and Actual Occupied Bays (Hourly Analysis) for January to August:")
print(forecast_table)
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\2736828876.py:33: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df_2024['parking_time'] = (df_2024['Lastupdated'] - df_2024['Status_Timestamp']).dt.total_seconds() / 60  # Convert to minutes
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\2736828876.py:39: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.
  df_hourly_2024 = df_2024.resample('H').agg({
Epoch 1/100
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\keras\src\layers\rnn\rnn.py:204: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
4470/4470 - 7s - 2ms/step - loss: 1.3542e-06
Epoch 2/100
4470/4470 - 6s - 1ms/step - loss: 1.3113e-06
Epoch 3/100
4470/4470 - 7s - 2ms/step - loss: 1.3231e-06
Epoch 4/100
4470/4470 - 6s - 1ms/step - loss: 1.3056e-06
Epoch 5/100
4470/4470 - 6s - 1ms/step - loss: 1.3031e-06
Epoch 6/100
4470/4470 - 6s - 1ms/step - loss: 1.3366e-06
Epoch 7/100
4470/4470 - 6s - 1ms/step - loss: 1.2787e-06
Epoch 8/100
4470/4470 - 6s - 1ms/step - loss: 1.3494e-06
Epoch 9/100
4470/4470 - 6s - 1ms/step - loss: 1.3393e-06
Epoch 10/100
4470/4470 - 6s - 1ms/step - loss: 1.3123e-06
Epoch 11/100
4470/4470 - 7s - 2ms/step - loss: 1.3167e-06
Epoch 12/100
4470/4470 - 8s - 2ms/step - loss: 1.3111e-06
Epoch 13/100
4470/4470 - 8s - 2ms/step - loss: 1.3531e-06
Epoch 14/100
4470/4470 - 8s - 2ms/step - loss: 1.3214e-06
Epoch 15/100
4470/4470 - 7s - 2ms/step - loss: 1.3481e-06
Epoch 16/100
4470/4470 - 6s - 1ms/step - loss: 1.3025e-06
Epoch 17/100
4470/4470 - 6s - 1ms/step - loss: 1.3456e-06
Epoch 18/100
4470/4470 - 6s - 1ms/step - loss: 1.3095e-06
Epoch 19/100
4470/4470 - 6s - 1ms/step - loss: 1.3102e-06
Epoch 20/100
4470/4470 - 6s - 1ms/step - loss: 1.3501e-06
Epoch 21/100
4470/4470 - 6s - 1ms/step - loss: 1.3188e-06
Epoch 22/100
4470/4470 - 6s - 1ms/step - loss: 1.3487e-06
Epoch 23/100
4470/4470 - 6s - 1ms/step - loss: 1.3425e-06
Epoch 24/100
4470/4470 - 6s - 1ms/step - loss: 1.2715e-06
Epoch 25/100
4470/4470 - 6s - 1ms/step - loss: 1.3347e-06
Epoch 26/100
4470/4470 - 7s - 2ms/step - loss: 1.3786e-06
Epoch 27/100
4470/4470 - 6s - 1ms/step - loss: 1.3203e-06
Epoch 28/100
4470/4470 - 6s - 1ms/step - loss: 1.3049e-06
Epoch 29/100
4470/4470 - 7s - 1ms/step - loss: 1.3710e-06
Epoch 30/100
4470/4470 - 8s - 2ms/step - loss: 1.3255e-06
Epoch 31/100
4470/4470 - 7s - 2ms/step - loss: 1.3362e-06
Epoch 32/100
4470/4470 - 9s - 2ms/step - loss: 1.2825e-06
Epoch 33/100
4470/4470 - 7s - 1ms/step - loss: 1.3332e-06
Epoch 34/100
4470/4470 - 6s - 1ms/step - loss: 1.3443e-06
Epoch 35/100
4470/4470 - 6s - 1ms/step - loss: 1.3142e-06
Epoch 36/100
4470/4470 - 6s - 1ms/step - loss: 1.3398e-06
Epoch 37/100
4470/4470 - 7s - 2ms/step - loss: 1.3199e-06
Epoch 38/100
4470/4470 - 8s - 2ms/step - loss: 1.2793e-06
Epoch 39/100
4470/4470 - 7s - 2ms/step - loss: 1.2975e-06
Epoch 40/100
4470/4470 - 7s - 2ms/step - loss: 1.3019e-06
Epoch 41/100
4470/4470 - 8s - 2ms/step - loss: 1.3006e-06
Epoch 42/100
4470/4470 - 8s - 2ms/step - loss: 1.3105e-06
Epoch 43/100
4470/4470 - 8s - 2ms/step - loss: 1.3356e-06
Epoch 44/100
4470/4470 - 7s - 2ms/step - loss: 1.3205e-06
Epoch 45/100
4470/4470 - 6s - 1ms/step - loss: 1.3335e-06
Epoch 46/100
4470/4470 - 7s - 2ms/step - loss: 1.3679e-06
Epoch 47/100
4470/4470 - 8s - 2ms/step - loss: 1.3173e-06
Epoch 48/100
4470/4470 - 7s - 2ms/step - loss: 1.3603e-06
Epoch 49/100
4470/4470 - 7s - 2ms/step - loss: 1.3084e-06
Epoch 50/100
4470/4470 - 8s - 2ms/step - loss: 1.2577e-06
Epoch 51/100
4470/4470 - 8s - 2ms/step - loss: 1.3311e-06
Epoch 52/100
4470/4470 - 7s - 2ms/step - loss: 1.3050e-06
Epoch 53/100
4470/4470 - 6s - 1ms/step - loss: 1.3281e-06
Epoch 54/100
4470/4470 - 8s - 2ms/step - loss: 1.3082e-06
Epoch 55/100
4470/4470 - 8s - 2ms/step - loss: 1.3177e-06
Epoch 56/100
4470/4470 - 6s - 1ms/step - loss: 1.2166e-06
Epoch 57/100
4470/4470 - 8s - 2ms/step - loss: 1.2517e-06
Epoch 58/100
4470/4470 - 8s - 2ms/step - loss: 1.1634e-06
Epoch 59/100
4470/4470 - 8s - 2ms/step - loss: 1.1589e-06
Epoch 60/100
4470/4470 - 7s - 2ms/step - loss: 1.1904e-06
Epoch 61/100
4470/4470 - 8s - 2ms/step - loss: 1.1808e-06
Epoch 62/100
4470/4470 - 7s - 2ms/step - loss: 1.1792e-06
Epoch 63/100
4470/4470 - 6s - 1ms/step - loss: 1.1298e-06
Epoch 64/100
4470/4470 - 7s - 2ms/step - loss: 1.1863e-06
Epoch 65/100
4470/4470 - 6s - 1ms/step - loss: 1.1352e-06
Epoch 66/100
4470/4470 - 8s - 2ms/step - loss: 1.2017e-06
Epoch 67/100
4470/4470 - 8s - 2ms/step - loss: 1.1338e-06
Epoch 68/100
4470/4470 - 6s - 1ms/step - loss: 1.1235e-06
Epoch 69/100
4470/4470 - 8s - 2ms/step - loss: 1.1678e-06
Epoch 70/100
4470/4470 - 8s - 2ms/step - loss: 1.1104e-06
Epoch 71/100
4470/4470 - 7s - 2ms/step - loss: 1.1310e-06
Epoch 72/100
4470/4470 - 8s - 2ms/step - loss: 1.1525e-06
Epoch 73/100
4470/4470 - 8s - 2ms/step - loss: 1.2162e-06
Epoch 74/100
4470/4470 - 8s - 2ms/step - loss: 1.1000e-06
Epoch 75/100
4470/4470 - 7s - 2ms/step - loss: 1.1516e-06
Epoch 76/100
4470/4470 - 6s - 1ms/step - loss: 1.1273e-06
Epoch 77/100
4470/4470 - 7s - 2ms/step - loss: 1.1712e-06
Epoch 78/100
4470/4470 - 9s - 2ms/step - loss: 1.1138e-06
Epoch 79/100
4470/4470 - 8s - 2ms/step - loss: 1.1060e-06
Epoch 80/100
4470/4470 - 8s - 2ms/step - loss: 1.1760e-06
Epoch 81/100
4470/4470 - 8s - 2ms/step - loss: 1.1135e-06
Epoch 82/100
4470/4470 - 7s - 2ms/step - loss: 1.1488e-06
Epoch 83/100
4470/4470 - 8s - 2ms/step - loss: 1.1159e-06
Epoch 84/100
4470/4470 - 7s - 2ms/step - loss: 1.1719e-06
Epoch 85/100
4470/4470 - 8s - 2ms/step - loss: 1.2050e-06
Epoch 86/100
4470/4470 - 6s - 1ms/step - loss: 1.1116e-06
Epoch 87/100
4470/4470 - 8s - 2ms/step - loss: 1.1157e-06
Epoch 88/100
4470/4470 - 8s - 2ms/step - loss: 1.1156e-06
Epoch 89/100
4470/4470 - 8s - 2ms/step - loss: 1.1119e-06
Epoch 90/100
4470/4470 - 8s - 2ms/step - loss: 1.1406e-06
Epoch 91/100
4470/4470 - 9s - 2ms/step - loss: 1.1545e-06
Epoch 92/100
4470/4470 - 7s - 1ms/step - loss: 1.1390e-06
Epoch 93/100
4470/4470 - 6s - 1ms/step - loss: 1.1129e-06
Epoch 94/100
4470/4470 - 6s - 1ms/step - loss: 1.1141e-06
Epoch 95/100
4470/4470 - 8s - 2ms/step - loss: 1.1078e-06
Epoch 96/100
4470/4470 - 7s - 2ms/step - loss: 1.1299e-06
Epoch 97/100
4470/4470 - 7s - 2ms/step - loss: 1.0441e-06
Epoch 98/100
4470/4470 - 7s - 2ms/step - loss: 1.1772e-06
Epoch 99/100
4470/4470 - 8s - 2ms/step - loss: 1.1573e-06
Epoch 100/100
4470/4470 - 8s - 2ms/step - loss: 1.1566e-06
140/140 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step
35/35 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step 
Train Score: 0.93 RMSE
Test Score: 29.36 RMSE
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 91ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 71ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 85ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 75ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 89ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 94ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 88ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 88ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 73ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 86ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 95ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 108ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 85ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 76ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 91ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 85ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 84ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 66ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 81ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 98ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 82ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 86ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 79ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 88ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 69ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 75ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 86ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 106ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 95ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 95ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 64ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 67ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 85ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 81ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 91ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 98ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 64ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 104ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 86ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 77ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 81ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 81ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 76ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 98ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 96ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 78ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 80ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 94ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 83ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 102ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 90ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 87ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 67ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 85ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 112ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 64ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 67ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 100ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 117ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 85ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 86ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 80ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 95ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 73ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 77ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 69ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 75ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 66ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 82ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 154ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 74ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 114ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 99ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 112ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 76ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 126ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 71ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 94ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 66ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 115ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 79ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 97ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 67ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 79ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 67ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 71ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 85ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 76ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 102ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 78ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 64ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 97ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 74ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 116ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 81ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 78ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 74ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 117ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 85ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 97ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 99ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 69ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 69ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 106ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 22ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 92ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 105ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 85ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 87ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 102ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 110ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 83ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 75ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 99ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 92ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 100ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 105ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 87ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 81ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 91ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 107ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 113ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 100ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 106ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 77ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 110ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 78ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 63ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 109ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 105ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 62ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 103ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 102ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 106ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 108ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 104ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 97ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 65ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 106ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 100ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 101ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 101ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 86ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 110ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 105ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 101ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 115ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 102ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 99ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 106ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 122ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 109ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 121ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 116ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 72ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 134ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 111ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 103ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 116ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 107ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 125ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 59ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 121ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 65ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 95ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 106ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 102ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 82ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 103ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 124ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 98ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 107ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 111ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 109ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 102ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 74ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 107ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 123ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 119ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 116ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 112ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 112ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 80ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 52ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 126ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 115ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 118ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 64ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 117ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 108ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 99ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 110ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 90ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 114ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 102ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 108ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 115ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 101ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 113ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 83ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 98ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 107ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 119ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 111ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 133ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 104ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 105ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 71ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 125ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 103ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 75ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 111ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 128ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 118ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 112ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 113ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 56ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 57ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 101ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 111ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 101ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 109ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 98ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 97ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 101ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 110ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 75ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 49ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 111ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 122ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 118ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 113ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 48ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 109ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 113ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 109ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 121ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 131ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 107ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 131ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 60ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 99ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 111ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 73ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 58ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 107ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 47ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 114ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 71ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 115ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 115ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 108ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 113ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 109ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 42ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 77ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 114ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 51ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 43ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 50ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 114ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 38ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 78ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\2736828876.py:115: FutureWarning: 'H' is deprecated and will be removed in a future version, please use 'h' instead.
  forecast_df = pd.DataFrame(forecast, index=pd.date_range(start='2025-01-01', periods=future_periods, freq='H'))
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\2736828876.py:116: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.
  forecast_monthly = forecast_df.resample('M').sum()
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\2736828876.py:122: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.
  df_hourly_2024_monthly = df_hourly_2024['Status_Description'].resample('M').sum()
No description has been provided for this image
Forecasted and Actual Occupied Bays (Hourly Analysis) for January to August:
     Month  Forecasted Occupied Bays (2025)  Actual Occupied Bays (2024)
0  2025-01                       143.592389                          100
1  2025-02                         0.000000                          146
2  2025-03                         0.000000                           97
3  2025-04                         0.000000                          259
4  2025-05                         0.000000                           61
5  2025-06                         0.000000                           59
6  2025-07                         0.000000                           45
7  2025-08                         0.000000                         2521

4.13. Interpretation of the results.¶

Additional Features: Consider incorporating more features (e.g., day of the week, special events) to improve the forecasting model. Hyperparameter Tuning: Experiment with different LSTM architectures(Long Short-Term Memory (LSTM)) is a type of artificial recurrent neural network (RNN) architecture used in the field of deep learning.), learning rates, or epochs to potentially improve the model's performance. Cross-Validation: Implement cross-validation to ensure the model's stability and performance across different data splits.

In [28]:
import pandas as pd
import pytz
from datetime import datetime

# Load the dataset
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
df = pd.read_csv(file_path)

# Convert relevant time columns to datetime
df['Lastupdated'] = pd.to_datetime(df['Lastupdated'], utc=True)
df['Status_Timestamp'] = pd.to_datetime(df['Status_Timestamp'], utc=True)

# Replace 'Status_Description' field values with 1 for 'Present' and 0 for 'Unoccupied'
df['Status_Description'] = df['Status_Description'].map({'Present': 1, 'Unoccupied': 0})

# Define the start date and current date in Melbourne timezone
melbourne_zone = pytz.timezone('Australia/Melbourne')
start_date = pd.to_datetime('2024-08-01', utc=True).tz_convert(melbourne_zone)
current_time = datetime.now(melbourne_zone)

# Filter data for the required date range
df_filtered = df[(df['Status_Timestamp'] >= start_date) & (df['Status_Timestamp'] <= current_time)]

# Extract the time of day (hour and minute) to group by
df_filtered['Time_of_Day'] = df_filtered['Status_Timestamp'].dt.strftime('%H:%M')

# Group data by time of day and check for available slots
available_slots_by_time = df_filtered[df_filtered['Status_Description'] == 0].groupby('Time_of_Day').agg({
    'KerbsideID': list,
    'Status_Description': 'count'
}).rename(columns={'Status_Description': 'Available_Slots'})

# Print the results
print(f"Available parking slots and corresponding Kerbside IDs from {start_date.strftime('%Y-%m-%d')} to {current_time.strftime('%Y-%m-%d')}:")
print(available_slots_by_time)

# Optionally, plot the results
plt.figure(figsize=(14, 7))
available_slots_by_time['Available_Slots'].plot(kind='bar', color='lightblue')
plt.title('Available Parking Slots by Time of Day')
plt.xlabel('Time of Day (HH:MM)')
plt.ylabel('Number of Available Slots')
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\3652058614.py:25: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df_filtered['Time_of_Day'] = df_filtered['Status_Timestamp'].dt.strftime('%H:%M')
Available parking slots and corresponding Kerbside IDs from 2024-08-01 to 2024-09-11:
                        KerbsideID  Available_Slots
Time_of_Day                                        
00:00                [8642, 20589]                2
00:02               [21521, 25091]                2
00:04                      [20588]                1
00:05        [65122, 10727, 17832]                3
00:07                      [10884]                1
...                            ...              ...
23:48                      [24991]                1
23:52                      [57316]                1
23:55                      [57230]                1
23:58               [16763, 21532]                2
23:59                      [10865]                1

[482 rows x 2 columns]
No description has been provided for this image

4.14. Resampling and Time Series Forecasting Using LSTM¶

This code preprocesses parking data by converting timestamps to the Melbourne timezone and filtering data for a specific date range. It resamples parking slot availability by time of day and normalizes the data. Using a Long Short-Term Memory (LSTM) model, it forecasts parking slot availability for the same period in 2025. The historical and forecasted data are plotted for visualization, aiding in understanding parking trends. Additionally, forecast results are presented in a tabular format for further analysis.

In [27]:
import pandas as pd
import pytz
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

# Load the dataset
file_path = r'C:\Users\ssgul\OneDrive\Documents\GitHub\MOP-Code\Playground\sgulluoglu\on-street-parking-bay-sensors.csv'
df = pd.read_csv(file_path)

# Convert relevant time columns to datetime
df['Lastupdated'] = pd.to_datetime(df['Lastupdated'], utc=True)
df['Status_Timestamp'] = pd.to_datetime(df['Status_Timestamp'], utc=True)

# Replace 'Status_Description' field values with 1 for 'Present' and 0 for 'Unoccupied'
df['Status_Description'] = df['Status_Description'].map({'Present': 1, 'Unoccupied': 0})

# Define the start date and current date in Melbourne timezone
melbourne_zone = pytz.timezone('Australia/Melbourne')
start_date = pd.to_datetime('2024-08-01', utc=True).tz_convert(melbourne_zone)
current_time = datetime.now(melbourne_zone)

# Filter data for the required date range
df_filtered = df[(df['Status_Timestamp'] >= start_date) & (df['Status_Timestamp'] <= current_time)]

# Extract the time of day (hour and minute) to group by
df_filtered['Time_of_Day'] = df_filtered['Status_Timestamp'].dt.strftime('%H:%M')

# Group data by time of day and check for available slots
available_slots_by_time = df_filtered[df_filtered['Status_Description'] == 0].groupby('Time_of_Day').agg({
    'KerbsideID': list,
    'Status_Description': 'count'
}).rename(columns={'Status_Description': 'Available_Slots'})

# Ensure 'Time_of_Day' is sorted and set as an index
available_slots_by_time = available_slots_by_time.sort_index()

# Prepare data for time series forecasting
available_slots_by_time['Available_Slots'] = available_slots_by_time['Available_Slots'].astype(float)

# Normalize the data
scaler = MinMaxScaler(feature_range=(0, 1))
slots_scaled = scaler.fit_transform(available_slots_by_time[['Available_Slots']])

# Function to create dataset matrix
def create_dataset(dataset, look_back=1):
    X, Y = [], []
    for i in range(len(dataset) - look_back - 1):
        a = dataset[i:(i + look_back), 0]
        X.append(a)
        Y.append(dataset[i + look_back, 0])
    return np.array(X), np.array(Y)

# Prepare the dataset for LSTM
look_back = 1
X, Y = create_dataset(slots_scaled, look_back)

# Reshape input to be [samples, time steps, features]
X = np.reshape(X, (X.shape[0], 1, X.shape[1]))

# Build LSTM Model
model = Sequential()
model.add(LSTM(100, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

# Train the model
model.fit(X, Y, epochs=100, batch_size=1, verbose=2)

# Forecast for the corresponding time in 2025
future_periods = len(available_slots_by_time)  # Same number of time points as in the historical data
forecast = []
current_batch = slots_scaled[-look_back:].reshape((1, 1, look_back))

for _ in range(future_periods):
    current_pred = model.predict(current_batch)[0]
    forecast.append(current_pred)
    current_batch = np.append(current_batch[:, :, 1:], [[current_pred]], axis=2)

# Invert forecast to original scale
forecast = scaler.inverse_transform(forecast)

# Create a date range for the forecast in 2025
forecast_index = pd.date_range(start='2025-08-01', periods=future_periods, freq='T')

# Plot historical and forecasted data
plt.figure(figsize=(14, 7))

# Convert the index to a proper datetime format for plotting
available_slots_by_time.index = pd.to_datetime(available_slots_by_time.index, format='%H:%M')
forecast_index = pd.to_datetime(forecast_index.strftime('%H:%M'), format='%H:%M')

# Plot available slots per time of day with forecast
plt.plot(available_slots_by_time.index, available_slots_by_time['Available_Slots'], label='2024 Data (Aug 1 - Today)', color='coral')
plt.plot(forecast_index, forecast, label='Forecast for 2025 (Aug 1 - Same period)', color='blue', linestyle='--')
plt.title('Available Parking Slots by Time of Day with LSTM Forecast')
plt.xlabel('Time of Day (HH:MM)')
plt.ylabel('Number of Available Slots')
plt.xticks(rotation=90)
plt.legend()

plt.tight_layout()
plt.show()

# Display forecast results in a table
forecast_table = pd.DataFrame({
    'Time of Day': available_slots_by_time.index.strftime('%H:%M'),
    'Forecasted Available Slots (2025)': forecast.flatten(),
})
print("\nForecasted Available Slots (Aug 1 - Same period in 2025):")
print(forecast_table)
Epoch 1/100
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\1754654200.py:30: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df_filtered['Time_of_Day'] = df_filtered['Status_Timestamp'].dt.strftime('%H:%M')
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\keras\src\layers\rnn\rnn.py:204: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
480/480 - 2s - 5ms/step - loss: 0.0077
Epoch 2/100
480/480 - 1s - 1ms/step - loss: 0.0053
Epoch 3/100
480/480 - 1s - 1ms/step - loss: 0.0050
Epoch 4/100
480/480 - 1s - 1ms/step - loss: 0.0046
Epoch 5/100
480/480 - 1s - 1ms/step - loss: 0.0046
Epoch 6/100
480/480 - 1s - 1ms/step - loss: 0.0047
Epoch 7/100
480/480 - 1s - 1ms/step - loss: 0.0047
Epoch 8/100
480/480 - 1s - 1ms/step - loss: 0.0047
Epoch 9/100
480/480 - 1s - 1ms/step - loss: 0.0046
Epoch 10/100
480/480 - 1s - 1ms/step - loss: 0.0046
Epoch 11/100
480/480 - 1s - 1ms/step - loss: 0.0047
Epoch 12/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 13/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 14/100
480/480 - 1s - 1ms/step - loss: 0.0047
Epoch 15/100
480/480 - 1s - 1ms/step - loss: 0.0047
Epoch 16/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 17/100
480/480 - 1s - 1ms/step - loss: 0.0047
Epoch 18/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 19/100
480/480 - 1s - 1ms/step - loss: 0.0046
Epoch 20/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 21/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 22/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 23/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 24/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 25/100
480/480 - 1s - 1ms/step - loss: 0.0046
Epoch 26/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 27/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 28/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 29/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 30/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 31/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 32/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 33/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 34/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 35/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 36/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 37/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 38/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 39/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 40/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 41/100
480/480 - 1s - 1ms/step - loss: 0.0045
Epoch 42/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 43/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 44/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 45/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 46/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 47/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 48/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 49/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 50/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 51/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 52/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 53/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 54/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 55/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 56/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 57/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 58/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 59/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 60/100
480/480 - 1s - 1ms/step - loss: 0.0044
Epoch 61/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 62/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 63/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 64/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 65/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 66/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 67/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 68/100
480/480 - 1s - 1ms/step - loss: 0.0041
Epoch 69/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 70/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 71/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 72/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 73/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 74/100
480/480 - 1s - 1ms/step - loss: 0.0041
Epoch 75/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 76/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 77/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 78/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 79/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 80/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 81/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 82/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 83/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 84/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 85/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 86/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 87/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 88/100
480/480 - 1s - 1ms/step - loss: 0.0041
Epoch 89/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 90/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 91/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 92/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 93/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 94/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 95/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 96/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 97/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 98/100
480/480 - 1s - 1ms/step - loss: 0.0042
Epoch 99/100
480/480 - 1s - 1ms/step - loss: 0.0043
Epoch 100/100
480/480 - 1s - 1ms/step - loss: 0.0042
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 171ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 74ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 54ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 34ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 44ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 35ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 31ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 32ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 28ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 45ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 27ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 40ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 41ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 30ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 33ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 37ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 29ms/step
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\1754654200.py:87: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  forecast_index = pd.date_range(start='2025-08-01', periods=future_periods, freq='T')
No description has been provided for this image
Forecasted Available Slots (Aug 1 - Same period in 2025):
    Time of Day  Forecasted Available Slots (2025)
0         00:00                           1.201797
1         00:02                           1.399664
2         00:04                           1.593084
3         00:05                           1.781590
4         00:07                           1.964766
..          ...                                ...
477       23:48                           5.114373
478       23:52                           5.114373
479       23:55                           5.114373
480       23:58                           5.114373
481       23:59                           5.114373

[482 rows x 2 columns]
In [26]:
import pandas as pd
import pytz
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
import requests

# API details
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'on-street-parking-bay-sensors'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
df = pd.read_csv(url, delimiter=';')

# List the column names to verify them
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# Convert the specified columns
columns_to_convert = ['lastupdated', 'status_timestamp']

for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Filter data to include only rows from January 2023 to August 2024
df = df[(df['status_timestamp'] >= '2023-01-01') & (df['status_timestamp'] <= '2024-08-31')]

# List missing values
print("\nMissing Values:")
print(df.isnull().sum())

# Fill missing values with values from other columns/rows
df.ffill(inplace=True)  # Forward fill
df.bfill(inplace=True)  # Backward fill

# Recheck missing values
print("\nMissing Values After Filling:")
print(df.isnull().sum())

# Calculate the parking time
if 'lastupdated' in df.columns and 'status_timestamp' in df.columns:
    df['parking_time'] = (df['lastupdated'] - df['status_timestamp']).dt.total_seconds() / 60  # Convert to minutes
    print("\nDataFrame with Parking Time:")
    print(df[['lastupdated', 'status_timestamp', 'parking_time']].head())
else:
    print("Required columns for parking time calculation are missing.")

# Set 'status_timestamp' as the index and ensure it is in datetime format
df.set_index('status_timestamp', inplace=True)

# Resample data to monthly frequency to find the average
df_monthly = df.resample('M').agg({
    'status_description': lambda x: (x == 'Present').sum(),  # Count 'Present' status
    'parking_time': 'mean'  # Average parking time
})

# Normalize the data
scaler = MinMaxScaler(feature_range=(0, 1))
df_monthly_scaled = scaler.fit_transform(df_monthly[['status_description']])

# Function to create dataset matrix
def create_dataset(dataset, look_back=1):
    X, Y = [], []
    for i in range(len(dataset) - look_back - 1):
        a = dataset[i:(i + look_back), 0]
        X.append(a)
        Y.append(dataset[i + look_back, 0])
    return np.array(X), np.array(Y)

# Prepare the dataset for LSTM
look_back = 1
X, Y = create_dataset(df_monthly_scaled, look_back)

# Reshape input to be [samples, time steps, features]
X = np.reshape(X, (X.shape[0], 1, X.shape[1]))

# Split into train and test sets
train_size = int(len(X) * 0.8)
test_size = len(X) - train_size
X_train, X_test = X[0:train_size], X[train_size:len(X)]
Y_train, Y_test = Y[0:train_size], Y[train_size:len(Y)]

# Build LSTM Model
model = Sequential()
model.add(LSTM(100, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

# Train the model
model.fit(X_train, Y_train, epochs=100, batch_size=1, verbose=2)

# Make predictions
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# Invert predictions to original scale
train_predict = scaler.inverse_transform(train_predict)
trainY = scaler.inverse_transform([Y_train])
test_predict = scaler.inverse_transform(test_predict)
testY = scaler.inverse_transform([Y_test])

# Calculate RMSE
train_score = np.sqrt(mean_squared_error(trainY[0], train_predict[:, 0]))
print(f'Train Score: {train_score:.2f} RMSE')
test_score = np.sqrt(mean_squared_error(testY[0], test_predict[:, 0]))
print(f'Test Score: {test_score:.2f} RMSE')

# Forecast for 8 months ahead (January to August 2025)
future_periods = 8
forecast = []
current_batch = df_monthly_scaled[-look_back:].reshape((1, 1, look_back))

for _ in range(future_periods):
    current_pred = model.predict(current_batch)[0]
    forecast.append(current_pred)
    current_batch = np.append(current_batch[:, :, 1:], [[current_pred]], axis=2)

# Invert forecast to original scale
forecast = scaler.inverse_transform(forecast)

# Create a date range for the forecast
forecast_index = pd.date_range(start='2025-01-01', periods=future_periods, freq='M')

# Plot historical and forecasted data
plt.figure(figsize=(14, 7))

# Plot number of occupied statuses per month with forecast
plt.plot(df_monthly.index, df_monthly['status_description'], label='Historical Data', color='coral')
plt.plot(forecast_index, forecast, label='Forecast for 2025', color='blue', linestyle='--')
plt.title('Monthly Number of Occupied Parking Bays with LSTM Forecast')
plt.xlabel('Month')
plt.ylabel('Number of Occupied Bays')
plt.legend()

plt.tight_layout()
plt.show()
Column Names:
['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
Updated Column: lastupdated
Updated Column: status_timestamp

Missing Values:
lastupdated             0
status_timestamp        0
zone_number           328
status_description      0
kerbsideid              0
location                0
dtype: int64

Missing Values After Filling:
lastupdated           0
status_timestamp      0
zone_number           0
status_description    0
kerbsideid            0
location              0
dtype: int64

DataFrame with Parking Time:
                lastupdated          status_timestamp  parking_time
0 2023-12-14 15:45:34+11:00 2023-12-14 14:41:25+11:00     64.150000
1 2023-12-14 15:45:34+11:00 2023-12-13 17:21:58+11:00   1343.600000
2 2023-12-15 10:45:34+11:00 2023-12-15 10:35:02+11:00     10.533333
3 2023-12-15 10:45:34+11:00 2023-12-15 09:39:46+11:00     65.800000
4 2023-12-18 15:45:34+11:00 2023-12-18 10:47:54+11:00    297.666667
Epoch 1/100
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\4087145141.py:67: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.
  df_monthly = df.resample('M').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\keras\src\layers\rnn\rnn.py:204: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
14/14 - 2s - 114ms/step - loss: 0.0924
Epoch 2/100
14/14 - 0s - 4ms/step - loss: 0.0705
Epoch 3/100
14/14 - 0s - 5ms/step - loss: 0.0547
Epoch 4/100
14/14 - 0s - 5ms/step - loss: 0.0459
Epoch 5/100
14/14 - 0s - 4ms/step - loss: 0.0392
Epoch 6/100
14/14 - 0s - 4ms/step - loss: 0.0373
Epoch 7/100
14/14 - 0s - 4ms/step - loss: 0.0350
Epoch 8/100
14/14 - 0s - 4ms/step - loss: 0.0343
Epoch 9/100
14/14 - 0s - 4ms/step - loss: 0.0328
Epoch 10/100
14/14 - 0s - 4ms/step - loss: 0.0318
Epoch 11/100
14/14 - 0s - 4ms/step - loss: 0.0306
Epoch 12/100
14/14 - 0s - 4ms/step - loss: 0.0297
Epoch 13/100
14/14 - 0s - 4ms/step - loss: 0.0288
Epoch 14/100
14/14 - 0s - 4ms/step - loss: 0.0283
Epoch 15/100
14/14 - 0s - 4ms/step - loss: 0.0275
Epoch 16/100
14/14 - 0s - 4ms/step - loss: 0.0276
Epoch 17/100
14/14 - 0s - 4ms/step - loss: 0.0264
Epoch 18/100
14/14 - 0s - 4ms/step - loss: 0.0261
Epoch 19/100
14/14 - 0s - 4ms/step - loss: 0.0256
Epoch 20/100
14/14 - 0s - 3ms/step - loss: 0.0255
Epoch 21/100
14/14 - 0s - 3ms/step - loss: 0.0252
Epoch 22/100
14/14 - 0s - 4ms/step - loss: 0.0248
Epoch 23/100
14/14 - 0s - 4ms/step - loss: 0.0246
Epoch 24/100
14/14 - 0s - 4ms/step - loss: 0.0247
Epoch 25/100
14/14 - 0s - 4ms/step - loss: 0.0244
Epoch 26/100
14/14 - 0s - 3ms/step - loss: 0.0242
Epoch 27/100
14/14 - 0s - 3ms/step - loss: 0.0240
Epoch 28/100
14/14 - 0s - 4ms/step - loss: 0.0242
Epoch 29/100
14/14 - 0s - 4ms/step - loss: 0.0240
Epoch 30/100
14/14 - 0s - 3ms/step - loss: 0.0239
Epoch 31/100
14/14 - 0s - 3ms/step - loss: 0.0239
Epoch 32/100
14/14 - 0s - 3ms/step - loss: 0.0243
Epoch 33/100
14/14 - 0s - 3ms/step - loss: 0.0240
Epoch 34/100
14/14 - 0s - 4ms/step - loss: 0.0239
Epoch 35/100
14/14 - 0s - 4ms/step - loss: 0.0239
Epoch 36/100
14/14 - 0s - 4ms/step - loss: 0.0239
Epoch 37/100
14/14 - 0s - 4ms/step - loss: 0.0239
Epoch 38/100
14/14 - 0s - 3ms/step - loss: 0.0243
Epoch 39/100
14/14 - 0s - 4ms/step - loss: 0.0243
Epoch 40/100
14/14 - 0s - 4ms/step - loss: 0.0239
Epoch 41/100
14/14 - 0s - 4ms/step - loss: 0.0246
Epoch 42/100
14/14 - 0s - 4ms/step - loss: 0.0239
Epoch 43/100
14/14 - 0s - 3ms/step - loss: 0.0240
Epoch 44/100
14/14 - 0s - 3ms/step - loss: 0.0242
Epoch 45/100
14/14 - 0s - 3ms/step - loss: 0.0237
Epoch 46/100
14/14 - 0s - 4ms/step - loss: 0.0240
Epoch 47/100
14/14 - 0s - 4ms/step - loss: 0.0240
Epoch 48/100
14/14 - 0s - 4ms/step - loss: 0.0238
Epoch 49/100
14/14 - 0s - 4ms/step - loss: 0.0239
Epoch 50/100
14/14 - 0s - 3ms/step - loss: 0.0240
Epoch 51/100
14/14 - 0s - 4ms/step - loss: 0.0237
Epoch 52/100
14/14 - 0s - 3ms/step - loss: 0.0241
Epoch 53/100
14/14 - 0s - 3ms/step - loss: 0.0237
Epoch 54/100
14/14 - 0s - 4ms/step - loss: 0.0238
Epoch 55/100
14/14 - 0s - 4ms/step - loss: 0.0241
Epoch 56/100
14/14 - 0s - 3ms/step - loss: 0.0236
Epoch 57/100
14/14 - 0s - 3ms/step - loss: 0.0241
Epoch 58/100
14/14 - 0s - 3ms/step - loss: 0.0240
Epoch 59/100
14/14 - 0s - 3ms/step - loss: 0.0238
Epoch 60/100
14/14 - 0s - 3ms/step - loss: 0.0237
Epoch 61/100
14/14 - 0s - 4ms/step - loss: 0.0239
Epoch 62/100
14/14 - 0s - 4ms/step - loss: 0.0238
Epoch 63/100
14/14 - 0s - 4ms/step - loss: 0.0238
Epoch 64/100
14/14 - 0s - 4ms/step - loss: 0.0241
Epoch 65/100
14/14 - 0s - 3ms/step - loss: 0.0239
Epoch 66/100
14/14 - 0s - 3ms/step - loss: 0.0238
Epoch 67/100
14/14 - 0s - 3ms/step - loss: 0.0239
Epoch 68/100
14/14 - 0s - 3ms/step - loss: 0.0237
Epoch 69/100
14/14 - 0s - 3ms/step - loss: 0.0238
Epoch 70/100
14/14 - 0s - 4ms/step - loss: 0.0238
Epoch 71/100
14/14 - 0s - 4ms/step - loss: 0.0242
Epoch 72/100
14/14 - 0s - 4ms/step - loss: 0.0240
Epoch 73/100
14/14 - 0s - 4ms/step - loss: 0.0238
Epoch 74/100
14/14 - 0s - 4ms/step - loss: 0.0241
Epoch 75/100
14/14 - 0s - 3ms/step - loss: 0.0239
Epoch 76/100
14/14 - 0s - 4ms/step - loss: 0.0246
Epoch 77/100
14/14 - 0s - 4ms/step - loss: 0.0238
Epoch 78/100
14/14 - 0s - 4ms/step - loss: 0.0241
Epoch 79/100
14/14 - 0s - 4ms/step - loss: 0.0240
Epoch 80/100
14/14 - 0s - 4ms/step - loss: 0.0237
Epoch 81/100
14/14 - 0s - 3ms/step - loss: 0.0237
Epoch 82/100
14/14 - 0s - 3ms/step - loss: 0.0237
Epoch 83/100
14/14 - 0s - 3ms/step - loss: 0.0238
Epoch 84/100
14/14 - 0s - 3ms/step - loss: 0.0237
Epoch 85/100
14/14 - 0s - 3ms/step - loss: 0.0237
Epoch 86/100
14/14 - 0s - 4ms/step - loss: 0.0238
Epoch 87/100
14/14 - 0s - 4ms/step - loss: 0.0244
Epoch 88/100
14/14 - 0s - 3ms/step - loss: 0.0245
Epoch 89/100
14/14 - 0s - 3ms/step - loss: 0.0237
Epoch 90/100
14/14 - 0s - 3ms/step - loss: 0.0240
Epoch 91/100
14/14 - 0s - 4ms/step - loss: 0.0243
Epoch 92/100
14/14 - 0s - 4ms/step - loss: 0.0241
Epoch 93/100
14/14 - 0s - 3ms/step - loss: 0.0240
Epoch 94/100
14/14 - 0s - 3ms/step - loss: 0.0241
Epoch 95/100
14/14 - 0s - 3ms/step - loss: 0.0242
Epoch 96/100
14/14 - 0s - 3ms/step - loss: 0.0241
Epoch 97/100
14/14 - 0s - 4ms/step - loss: 0.0239
Epoch 98/100
14/14 - 0s - 3ms/step - loss: 0.0242
Epoch 99/100
14/14 - 0s - 3ms/step - loss: 0.0239
Epoch 100/100
14/14 - 0s - 4ms/step - loss: 0.0240
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 175ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 212ms/step
Train Score: 39.69 RMSE
Test Score: 114.17 RMSE
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 25ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 26ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 24ms/step
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\4087145141.py:137: FutureWarning: 'M' is deprecated and will be removed in a future version, please use 'ME' instead.
  forecast_index = pd.date_range(start='2025-01-01', periods=future_periods, freq='M')
No description has been provided for this image

4.15. Forecast future parking occupancy¶

This code predicts future parking occupancy by leveraging Melbourne's parking sensor data. It preprocesses timestamps into the Melbourne timezone and filters data for the last hour, focusing on occupied parking spots. Using an LSTM neural network, it trains a model with resampled data aggregated per minute. The model forecasts the number of occupied parking spots, allowing for the calculation of available spots. The system is evaluated using RMSE, providing insights into prediction accuracy and enabling better parking management strategies.

In [13]:
import pandas as pd
import pytz
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
import requests
from datetime import datetime, timedelta

# API details
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'on-street-parking-bay-sensors'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
df = pd.read_csv(url, delimiter=';')

# List the column names to verify them
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# Convert the specified columns
columns_to_convert = ['lastupdated', 'status_timestamp']

for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Filter data to include only rows from the last hour
one_hour_ago = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(hours=1)
df = df[df['status_timestamp'] >= one_hour_ago]

# Filter to include only rows where status_description is 'Present'
df_present = df[df['status_description'] == 'Present']

# Set 'status_timestamp' as the index and ensure it is in datetime format
df_present.set_index('status_timestamp', inplace=True)

# Resample data to a minute frequency to find the number of 'Present' statuses per kerbside ID
df_minutely = df_present.resample('T').agg({
    'kerbsideid': 'count'
})

# Calculate the total number of unique kerbside IDs in the dataset
total_kerbside_ids = df['kerbsideid'].nunique()

# Normalize the data
scaler = MinMaxScaler(feature_range=(0, 1))
df_minutely_scaled = scaler.fit_transform(df_minutely)

# Function to create dataset matrix
def create_dataset(dataset, look_back=1):
    X, Y = [], []
    for i in range(len(dataset) - look_back - 1):
        a = dataset[i:(i + look_back), 0]
        X.append(a)
        Y.append(dataset[i + look_back, 0])
    return np.array(X), np.array(Y)

# Prepare the dataset for LSTM
look_back = 1
X, Y = create_dataset(df_minutely_scaled, look_back)

# Reshape input to be [samples, time steps, features]
X = np.reshape(X, (X.shape[0], 1, X.shape[1]))

# Split into train and test sets
train_size = int(len(X) * 0.8)
test_size = len(X) - train_size
X_train, X_test = X[0:train_size], X[train_size:len(X)]
Y_train, Y_test = Y[0:train_size], Y[train_size:len(Y)]

# Build LSTM Model
model = Sequential()
model.add(LSTM(100, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

# Train the model
model.fit(X_train, Y_train, epochs=100, batch_size=1, verbose=2)

# Make predictions
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# Invert predictions to original scale
train_predict = scaler.inverse_transform(train_predict)
trainY = scaler.inverse_transform([Y_train])
test_predict = scaler.inverse_transform(test_predict)
testY = scaler.inverse_transform([Y_test])

# Calculate RMSE
train_score = np.sqrt(mean_squared_error(trainY[0], train_predict[:, 0]))
print(f'Train Score: {train_score:.2f} RMSE')
test_score = np.sqrt(mean_squared_error(testY[0], test_predict[:, 0]))
print(f'Test Score: {test_score:.2f} RMSE')

# Forecast the occupied spots for the next minute
forecast_occupied = model.predict(X_test[-1].reshape(1, 1, look_back))
forecast_occupied = scaler.inverse_transform(forecast_occupied)

# Calculate available spots
forecast_available = total_kerbside_ids - forecast_occupied[0][0]

# Round to the nearest integer
forecast_available_rounded = round(forecast_available)

# List the forecasted available spots
print(f"\nForecasted Available Kerbside IDs (next minute): {forecast_available_rounded}")
Column Names:
['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
Updated Column: lastupdated
Updated Column: status_timestamp
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\3729577185.py:52: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\keras\src\layers\rnn\rnn.py:204: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
Epoch 1/100
43/43 - 2s - 43ms/step - loss: 0.1419
Epoch 2/100
43/43 - 0s - 2ms/step - loss: 0.0531
Epoch 3/100
43/43 - 0s - 2ms/step - loss: 0.0402
Epoch 4/100
43/43 - 0s - 2ms/step - loss: 0.0386
Epoch 5/100
43/43 - 0s - 2ms/step - loss: 0.0378
Epoch 6/100
43/43 - 0s - 2ms/step - loss: 0.0382
Epoch 7/100
43/43 - 0s - 2ms/step - loss: 0.0381
Epoch 8/100
43/43 - 0s - 2ms/step - loss: 0.0375
Epoch 9/100
43/43 - 0s - 2ms/step - loss: 0.0381
Epoch 10/100
43/43 - 0s - 2ms/step - loss: 0.0379
Epoch 11/100
43/43 - 0s - 2ms/step - loss: 0.0375
Epoch 12/100
43/43 - 0s - 2ms/step - loss: 0.0382
Epoch 13/100
43/43 - 0s - 2ms/step - loss: 0.0378
Epoch 14/100
43/43 - 0s - 2ms/step - loss: 0.0376
Epoch 15/100
43/43 - 0s - 2ms/step - loss: 0.0376
Epoch 16/100
43/43 - 0s - 2ms/step - loss: 0.0373
Epoch 17/100
43/43 - 0s - 2ms/step - loss: 0.0377
Epoch 18/100
43/43 - 0s - 2ms/step - loss: 0.0376
Epoch 19/100
43/43 - 0s - 2ms/step - loss: 0.0373
Epoch 20/100
43/43 - 0s - 2ms/step - loss: 0.0372
Epoch 21/100
43/43 - 0s - 2ms/step - loss: 0.0377
Epoch 22/100
43/43 - 0s - 2ms/step - loss: 0.0377
Epoch 23/100
43/43 - 0s - 2ms/step - loss: 0.0376
Epoch 24/100
43/43 - 0s - 2ms/step - loss: 0.0380
Epoch 25/100
43/43 - 0s - 2ms/step - loss: 0.0372
Epoch 26/100
43/43 - 0s - 2ms/step - loss: 0.0378
Epoch 27/100
43/43 - 0s - 2ms/step - loss: 0.0372
Epoch 28/100
43/43 - 0s - 2ms/step - loss: 0.0371
Epoch 29/100
43/43 - 0s - 2ms/step - loss: 0.0387
Epoch 30/100
43/43 - 0s - 2ms/step - loss: 0.0375
Epoch 31/100
43/43 - 0s - 2ms/step - loss: 0.0384
Epoch 32/100
43/43 - 0s - 2ms/step - loss: 0.0374
Epoch 33/100
43/43 - 0s - 2ms/step - loss: 0.0374
Epoch 34/100
43/43 - 0s - 2ms/step - loss: 0.0383
Epoch 35/100
43/43 - 0s - 2ms/step - loss: 0.0371
Epoch 36/100
43/43 - 0s - 2ms/step - loss: 0.0387
Epoch 37/100
43/43 - 0s - 2ms/step - loss: 0.0374
Epoch 38/100
43/43 - 0s - 2ms/step - loss: 0.0377
Epoch 39/100
43/43 - 0s - 2ms/step - loss: 0.0371
Epoch 40/100
43/43 - 0s - 2ms/step - loss: 0.0383
Epoch 41/100
43/43 - 0s - 2ms/step - loss: 0.0376
Epoch 42/100
43/43 - 0s - 2ms/step - loss: 0.0373
Epoch 43/100
43/43 - 0s - 2ms/step - loss: 0.0372
Epoch 44/100
43/43 - 0s - 2ms/step - loss: 0.0384
Epoch 45/100
43/43 - 0s - 2ms/step - loss: 0.0377
Epoch 46/100
43/43 - 0s - 2ms/step - loss: 0.0380
Epoch 47/100
43/43 - 0s - 2ms/step - loss: 0.0380
Epoch 48/100
43/43 - 0s - 2ms/step - loss: 0.0376
Epoch 49/100
43/43 - 0s - 2ms/step - loss: 0.0383
Epoch 50/100
43/43 - 0s - 2ms/step - loss: 0.0372
Epoch 51/100
43/43 - 0s - 2ms/step - loss: 0.0386
Epoch 52/100
43/43 - 0s - 2ms/step - loss: 0.0374
Epoch 53/100
43/43 - 0s - 2ms/step - loss: 0.0374
Epoch 54/100
43/43 - 0s - 2ms/step - loss: 0.0374
Epoch 55/100
43/43 - 0s - 2ms/step - loss: 0.0373
Epoch 56/100
43/43 - 0s - 2ms/step - loss: 0.0373
Epoch 57/100
43/43 - 0s - 2ms/step - loss: 0.0374
Epoch 58/100
43/43 - 0s - 2ms/step - loss: 0.0384
Epoch 59/100
43/43 - 0s - 2ms/step - loss: 0.0381
Epoch 60/100
43/43 - 0s - 2ms/step - loss: 0.0376
Epoch 61/100
43/43 - 0s - 2ms/step - loss: 0.0376
Epoch 62/100
43/43 - 0s - 2ms/step - loss: 0.0372
Epoch 63/100
43/43 - 0s - 2ms/step - loss: 0.0385
Epoch 64/100
43/43 - 0s - 2ms/step - loss: 0.0381
Epoch 65/100
43/43 - 0s - 2ms/step - loss: 0.0378
Epoch 66/100
43/43 - 0s - 2ms/step - loss: 0.0378
Epoch 67/100
43/43 - 0s - 2ms/step - loss: 0.0373
Epoch 68/100
43/43 - 0s - 2ms/step - loss: 0.0378
Epoch 69/100
43/43 - 0s - 2ms/step - loss: 0.0382
Epoch 70/100
43/43 - 0s - 2ms/step - loss: 0.0374
Epoch 71/100
43/43 - 0s - 2ms/step - loss: 0.0382
Epoch 72/100
43/43 - 0s - 2ms/step - loss: 0.0383
Epoch 73/100
43/43 - 0s - 2ms/step - loss: 0.0382
Epoch 74/100
43/43 - 0s - 2ms/step - loss: 0.0377
Epoch 75/100
43/43 - 0s - 2ms/step - loss: 0.0377
Epoch 76/100
43/43 - 0s - 2ms/step - loss: 0.0379
Epoch 77/100
43/43 - 0s - 2ms/step - loss: 0.0367
Epoch 78/100
43/43 - 0s - 2ms/step - loss: 0.0387
Epoch 79/100
43/43 - 0s - 2ms/step - loss: 0.0378
Epoch 80/100
43/43 - 0s - 2ms/step - loss: 0.0373
Epoch 81/100
43/43 - 0s - 2ms/step - loss: 0.0369
Epoch 82/100
43/43 - 0s - 2ms/step - loss: 0.0375
Epoch 83/100
43/43 - 0s - 2ms/step - loss: 0.0376
Epoch 84/100
43/43 - 0s - 2ms/step - loss: 0.0379
Epoch 85/100
43/43 - 0s - 2ms/step - loss: 0.0379
Epoch 86/100
43/43 - 0s - 2ms/step - loss: 0.0368
Epoch 87/100
43/43 - 0s - 2ms/step - loss: 0.0370
Epoch 88/100
43/43 - 0s - 2ms/step - loss: 0.0377
Epoch 89/100
43/43 - 0s - 2ms/step - loss: 0.0370
Epoch 90/100
43/43 - 0s - 2ms/step - loss: 0.0373
Epoch 91/100
43/43 - 0s - 2ms/step - loss: 0.0370
Epoch 92/100
43/43 - 0s - 2ms/step - loss: 0.0375
Epoch 93/100
43/43 - 0s - 2ms/step - loss: 0.0383
Epoch 94/100
43/43 - 0s - 2ms/step - loss: 0.0374
Epoch 95/100
43/43 - 0s - 2ms/step - loss: 0.0380
Epoch 96/100
43/43 - 0s - 2ms/step - loss: 0.0385
Epoch 97/100
43/43 - 0s - 2ms/step - loss: 0.0382
Epoch 98/100
43/43 - 0s - 2ms/step - loss: 0.0374
Epoch 99/100
43/43 - 0s - 2ms/step - loss: 0.0382
Epoch 100/100
43/43 - 0s - 2ms/step - loss: 0.0372
2/2 ━━━━━━━━━━━━━━━━━━━━ 1s 332ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 39ms/step
Train Score: 3.05 RMSE
Test Score: 4.60 RMSE
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 46ms/step

Forecasted Available Kerbside IDs (next minute): 1166

5. Prediction Analysis:(for average prediction)¶

1 hour ago data were taken from the dataset, predict the next minute available parking kerbside ID s on the map. Due to the prediction for the near future, according to the literature research, 15 minutes to 1 hour data is the most suitable data for forecasting near future.

If the parking status updates frequently

Short-Term Prediction (Next Minute to Hour): Use data intervals of 5 to 15 minutes.

Medium-Term Prediction (Next Day to Week): Aggregate the data to an hourly interval.\

Long-Term Prediction (Next Month to Year): Aggregate the data to a daily or weekly interval.

In our project, we are aiming to predict: next minute for who use the app, find the available parking spot. we are aiming to predict: next day for who use the app to find an available spot for tomorrow. we are aiming to predict: next month or next year who use the app (council) for planning the city density in the future.

Short-Term Prediction :Here , I prefer 1 hour , 30 minutes and 15 minutes time intervals to make a comparision on data to underststand which interval is suitable for my dataset.

1 hour data used for prediction.

In [14]:
import pandas as pd
import pytz
import numpy as np
import matplotlib.pyplot as plt
import geopandas as gpd
import contextily as ctx
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
import requests
from datetime import datetime, timedelta

# API details
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'on-street-parking-bay-sensors'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
df = pd.read_csv(url, delimiter=';')

# List the column names to verify them
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# Convert the specified columns
columns_to_convert = ['lastupdated', 'status_timestamp']

for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Filter data to include only rows from the last hour
one_hour_ago = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(hours=1)
df = df[df['status_timestamp'] >= one_hour_ago]

# Calculate the total number of unique kerbside IDs in the dataset
total_kerbside_ids = df['kerbsideid'].nunique()

# Filter to include only rows where status_description is 'Present'
df_present = df[df['status_description'] == 'Present']

# Set 'status_timestamp' as the index and ensure it is in datetime format
df_present.set_index('status_timestamp', inplace=True)

# Resample data to a minute frequency to find the number of 'Present' statuses per kerbside ID
df_minutely = df_present.resample('T').agg({
    'kerbsideid': 'count'
})

# Normalize the data
scaler = MinMaxScaler(feature_range=(0, 1))
df_minutely_scaled = scaler.fit_transform(df_minutely)

# Function to create dataset matrix
def create_dataset(dataset, look_back=1):
    X, Y = [], []
    for i in range(len(dataset) - look_back - 1):
        a = dataset[i:(i + look_back), 0]
        X.append(a)
        Y.append(dataset[i + look_back, 0])
    return np.array(X), np.array(Y)

# Prepare the dataset for LSTM
look_back = 1
X, Y = create_dataset(df_minutely_scaled, look_back)

# Reshape input to be [samples, time steps, features]
X = np.reshape(X, (X.shape[0], 1, X.shape[1]))

# Split into train and test sets
train_size = int(len(X) * 0.8)
test_size = len(X) - train_size
X_train, X_test = X[0:train_size], X[train_size:]
Y_train, Y_test = Y[0:train_size], Y[train_size:]

# Build LSTM Model
model = Sequential()
model.add(LSTM(100, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

# Train the model
model.fit(X_train, Y_train, epochs=100, batch_size=1, verbose=2)

# Make predictions
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# Invert predictions to original scale
train_predict = scaler.inverse_transform(train_predict)
trainY = scaler.inverse_transform([Y_train])
test_predict = scaler.inverse_transform(test_predict)
testY = scaler.inverse_transform([Y_test])

# Calculate RMSE
train_score = np.sqrt(mean_squared_error(trainY[0], train_predict[:, 0]))
print(f'Train Score: {train_score:.2f} RMSE')
test_score = np.sqrt(mean_squared_error(testY[0], test_predict[:, 0]))
print(f'Test Score: {test_score:.2f} RMSE')

# Forecast the occupied spots for the next minute
forecast_occupied = model.predict(X_test[-1].reshape(1, 1, look_back))
forecast_occupied = scaler.inverse_transform(forecast_occupied)

# Calculate available spots
forecast_available = total_kerbside_ids - forecast_occupied[0][0]

# Round to the nearest integer
forecast_available_rounded = round(forecast_available)

# Print the number of available spots
print(f"\nForecasted Available Parking Spots (next minute): {forecast_available_rounded}")

# Identify available kerbside IDs based on the prediction
df_available = df[~df['kerbsideid'].isin(df_present['kerbsideid'].unique())]

# Get the unique kerbside IDs and their locations
available_kerbside_ids = df_available[['kerbsideid', 'location']].drop_duplicates()

# Print the available kerbside IDs and their locations
print("\nAvailable Kerbside IDs and Their Locations:")
print(available_kerbside_ids)

# Convert location to separate latitude and longitude columns
available_kerbside_ids[['Latitude', 'Longitude']] = available_kerbside_ids['location'].str.split(',', expand=True)
available_kerbside_ids['Latitude'] = available_kerbside_ids['Latitude'].astype(float)
available_kerbside_ids['Longitude'] = available_kerbside_ids['Longitude'].astype(float)

# Write the available kerbside IDs and locations to a CSV file
output_file = 'available_kerbside_ids.csv'
available_kerbside_ids.to_csv(output_file, index=False)
print(f"\nAvailable kerbside IDs and their locations have been written to {output_file}")

# Plot available spots on a map
gdf = gpd.GeoDataFrame(available_kerbside_ids, geometry=gpd.points_from_xy(available_kerbside_ids.Longitude, available_kerbside_ids.Latitude))

# Plot the available parking spots
gdf = gdf.set_crs(epsg=4326)  # Set the coordinate reference system to WGS84
ax = gdf.plot(figsize=(10, 10), color='blue', markersize=5)

# Add basemap using contextily
ctx.add_basemap(ax, crs=gdf.crs, source=ctx.providers.CartoDB.Positron)

# Add text annotation for total available spots
ax.annotate(f"Total Available Spots: {forecast_available_rounded}", 
            xy=(0.1, 0.9), xycoords='axes fraction', fontsize=12, color='red', 
            backgroundcolor='white')

plt.title('Forecasted Available Parking Spots in Melbourne')
plt.xlabel('Longitude')
plt.ylabel('Latitude')

# Force display of plot
plt.show()
Column Names:
['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
Updated Column: lastupdated
Updated Column: status_timestamp
Epoch 1/100
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\4146684214.py:57: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\keras\src\layers\rnn\rnn.py:204: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
44/44 - 3s - 58ms/step - loss: 0.1399
Epoch 2/100
44/44 - 0s - 4ms/step - loss: 0.0472
Epoch 3/100
44/44 - 0s - 3ms/step - loss: 0.0365
Epoch 4/100
44/44 - 0s - 3ms/step - loss: 0.0361
Epoch 5/100
44/44 - 0s - 3ms/step - loss: 0.0362
Epoch 6/100
44/44 - 0s - 3ms/step - loss: 0.0364
Epoch 7/100
44/44 - 0s - 3ms/step - loss: 0.0359
Epoch 8/100
44/44 - 0s - 3ms/step - loss: 0.0364
Epoch 9/100
44/44 - 0s - 3ms/step - loss: 0.0359
Epoch 10/100
44/44 - 0s - 3ms/step - loss: 0.0359
Epoch 11/100
44/44 - 0s - 3ms/step - loss: 0.0359
Epoch 12/100
44/44 - 0s - 3ms/step - loss: 0.0357
Epoch 13/100
44/44 - 0s - 3ms/step - loss: 0.0355
Epoch 14/100
44/44 - 0s - 3ms/step - loss: 0.0357
Epoch 15/100
44/44 - 0s - 3ms/step - loss: 0.0361
Epoch 16/100
44/44 - 0s - 3ms/step - loss: 0.0365
Epoch 17/100
44/44 - 0s - 3ms/step - loss: 0.0361
Epoch 18/100
44/44 - 0s - 3ms/step - loss: 0.0364
Epoch 19/100
44/44 - 0s - 3ms/step - loss: 0.0355
Epoch 20/100
44/44 - 0s - 3ms/step - loss: 0.0365
Epoch 21/100
44/44 - 0s - 3ms/step - loss: 0.0358
Epoch 22/100
44/44 - 0s - 2ms/step - loss: 0.0368
Epoch 23/100
44/44 - 0s - 2ms/step - loss: 0.0360
Epoch 24/100
44/44 - 0s - 2ms/step - loss: 0.0366
Epoch 25/100
44/44 - 0s - 2ms/step - loss: 0.0359
Epoch 26/100
44/44 - 0s - 2ms/step - loss: 0.0357
Epoch 27/100
44/44 - 0s - 2ms/step - loss: 0.0354
Epoch 28/100
44/44 - 0s - 2ms/step - loss: 0.0358
Epoch 29/100
44/44 - 0s - 2ms/step - loss: 0.0353
Epoch 30/100
44/44 - 0s - 2ms/step - loss: 0.0355
Epoch 31/100
44/44 - 0s - 2ms/step - loss: 0.0362
Epoch 32/100
44/44 - 0s - 2ms/step - loss: 0.0357
Epoch 33/100
44/44 - 0s - 2ms/step - loss: 0.0355
Epoch 34/100
44/44 - 0s - 2ms/step - loss: 0.0353
Epoch 35/100
44/44 - 0s - 2ms/step - loss: 0.0364
Epoch 36/100
44/44 - 0s - 2ms/step - loss: 0.0362
Epoch 37/100
44/44 - 0s - 2ms/step - loss: 0.0362
Epoch 38/100
44/44 - 0s - 2ms/step - loss: 0.0351
Epoch 39/100
44/44 - 0s - 2ms/step - loss: 0.0366
Epoch 40/100
44/44 - 0s - 2ms/step - loss: 0.0350
Epoch 41/100
44/44 - 0s - 2ms/step - loss: 0.0361
Epoch 42/100
44/44 - 0s - 2ms/step - loss: 0.0351
Epoch 43/100
44/44 - 0s - 2ms/step - loss: 0.0363
Epoch 44/100
44/44 - 0s - 2ms/step - loss: 0.0353
Epoch 45/100
44/44 - 0s - 2ms/step - loss: 0.0366
Epoch 46/100
44/44 - 0s - 2ms/step - loss: 0.0361
Epoch 47/100
44/44 - 0s - 2ms/step - loss: 0.0356
Epoch 48/100
44/44 - 0s - 2ms/step - loss: 0.0351
Epoch 49/100
44/44 - 0s - 2ms/step - loss: 0.0353
Epoch 50/100
44/44 - 0s - 2ms/step - loss: 0.0375
Epoch 51/100
44/44 - 0s - 2ms/step - loss: 0.0359
Epoch 52/100
44/44 - 0s - 2ms/step - loss: 0.0356
Epoch 53/100
44/44 - 0s - 2ms/step - loss: 0.0357
Epoch 54/100
44/44 - 0s - 2ms/step - loss: 0.0367
Epoch 55/100
44/44 - 0s - 2ms/step - loss: 0.0363
Epoch 56/100
44/44 - 0s - 2ms/step - loss: 0.0354
Epoch 57/100
44/44 - 0s - 2ms/step - loss: 0.0359
Epoch 58/100
44/44 - 0s - 2ms/step - loss: 0.0374
Epoch 59/100
44/44 - 0s - 2ms/step - loss: 0.0355
Epoch 60/100
44/44 - 0s - 2ms/step - loss: 0.0365
Epoch 61/100
44/44 - 0s - 2ms/step - loss: 0.0360
Epoch 62/100
44/44 - 0s - 2ms/step - loss: 0.0353
Epoch 63/100
44/44 - 0s - 2ms/step - loss: 0.0351
Epoch 64/100
44/44 - 0s - 2ms/step - loss: 0.0354
Epoch 65/100
44/44 - 0s - 2ms/step - loss: 0.0363
Epoch 66/100
44/44 - 0s - 2ms/step - loss: 0.0354
Epoch 67/100
44/44 - 0s - 2ms/step - loss: 0.0377
Epoch 68/100
44/44 - 0s - 2ms/step - loss: 0.0362
Epoch 69/100
44/44 - 0s - 2ms/step - loss: 0.0358
Epoch 70/100
44/44 - 0s - 2ms/step - loss: 0.0350
Epoch 71/100
44/44 - 0s - 2ms/step - loss: 0.0362
Epoch 72/100
44/44 - 0s - 2ms/step - loss: 0.0356
Epoch 73/100
44/44 - 0s - 2ms/step - loss: 0.0356
Epoch 74/100
44/44 - 0s - 2ms/step - loss: 0.0357
Epoch 75/100
44/44 - 0s - 2ms/step - loss: 0.0369
Epoch 76/100
44/44 - 0s - 2ms/step - loss: 0.0346
Epoch 77/100
44/44 - 0s - 2ms/step - loss: 0.0359
Epoch 78/100
44/44 - 0s - 2ms/step - loss: 0.0355
Epoch 79/100
44/44 - 0s - 2ms/step - loss: 0.0353
Epoch 80/100
44/44 - 0s - 2ms/step - loss: 0.0354
Epoch 81/100
44/44 - 0s - 2ms/step - loss: 0.0364
Epoch 82/100
44/44 - 0s - 2ms/step - loss: 0.0355
Epoch 83/100
44/44 - 0s - 2ms/step - loss: 0.0356
Epoch 84/100
44/44 - 0s - 2ms/step - loss: 0.0352
Epoch 85/100
44/44 - 0s - 2ms/step - loss: 0.0354
Epoch 86/100
44/44 - 0s - 2ms/step - loss: 0.0355
Epoch 87/100
44/44 - 0s - 2ms/step - loss: 0.0358
Epoch 88/100
44/44 - 0s - 2ms/step - loss: 0.0360
Epoch 89/100
44/44 - 0s - 2ms/step - loss: 0.0351
Epoch 90/100
44/44 - 0s - 2ms/step - loss: 0.0356
Epoch 91/100
44/44 - 0s - 2ms/step - loss: 0.0360
Epoch 92/100
44/44 - 0s - 2ms/step - loss: 0.0359
Epoch 93/100
44/44 - 0s - 2ms/step - loss: 0.0355
Epoch 94/100
44/44 - 0s - 2ms/step - loss: 0.0359
Epoch 95/100
44/44 - 0s - 2ms/step - loss: 0.0360
Epoch 96/100
44/44 - 0s - 2ms/step - loss: 0.0361
Epoch 97/100
44/44 - 0s - 2ms/step - loss: 0.0354
Epoch 98/100
44/44 - 0s - 2ms/step - loss: 0.0359
Epoch 99/100
44/44 - 0s - 2ms/step - loss: 0.0367
Epoch 100/100
44/44 - 0s - 2ms/step - loss: 0.0352
2/2 ━━━━━━━━━━━━━━━━━━━━ 0s 130ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step
Train Score: 2.98 RMSE
Test Score: 5.00 RMSE
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 23ms/step

Forecasted Available Parking Spots (next minute): 1200

Available Kerbside IDs and Their Locations:
      kerbsideid                                 location
2546       65112    -37.81023362406719, 144.9689236847353
2547       65167  -37.810643554488905, 144.96786024613817
2554       65567  -37.813491215768735, 144.95811837961972
2556       65560   -37.81343025022676, 144.95832711066356
2557       65551   -37.81332963316226, 144.95867229615575
...          ...                                      ...
6250       62349    -37.81820345794348, 144.9574635295486
6251       54321   -37.81415024868862, 144.96043413985802
6253       51620  -37.815859655649945, 144.96962898624355
6254       53227   -37.81273085753364, 144.96235890366904
6258       53226   -37.81278168256417, 144.96238231051336

[653 rows x 2 columns]

Available kerbside IDs and their locations have been written to available_kerbside_ids.csv
No description has been provided for this image

5.1. Short-Term Prediction¶

Here , I prefer 1 hour , 30 minutes and 15 minutes time intervals to make a comparision on data to underststand which interval is suitable for my dataset.

30 minutes data used for prediction.

ValueError: Not enough data points to create dataset. Try reducing the look_back parameter.

The code is not working correctly, because the the model do not create enough data points for training the dataset.

In [15]:
import pandas as pd
import pytz
import numpy as np
import matplotlib.pyplot as plt
import geopandas as gpd
import contextily as ctx
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import requests
from datetime import datetime, timedelta

# API details
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'on-street-parking-bay-sensors'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
df = pd.read_csv(url, delimiter=';')

# List the column names to verify them
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# Convert the specified columns
columns_to_convert = ['lastupdated', 'status_timestamp']

for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Option 2: Extend the data collection interval to 1 hour
one_hour_ago = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(hours=1)
df = df[df['status_timestamp'] >= one_hour_ago]

# Calculate the total number of unique kerbside IDs in the dataset
total_kerbside_ids = df['kerbsideid'].nunique()

# Filter to include only rows where status_description is 'Present'
df_present = df[df['status_description'] == 'Present']

# Set 'status_timestamp' as the index and ensure it is in datetime format
df_present.set_index('status_timestamp', inplace=True)

# Resample data to a 30-minute frequency to find the number of 'Present' statuses per kerbside ID
df_30min = df_present.resample('30T').agg({
    'kerbsideid': 'count'
})

# Check if there are enough data points
print(f"Resampled data shape: {df_30min.shape}")

# Normalize the data
scaler = MinMaxScaler(feature_range=(0, 1))
df_30min_scaled = scaler.fit_transform(df_30min)

# Function to create dataset matrix
def create_dataset(dataset, look_back=1):
    X, Y = [], []
    for i in range(len(dataset) - look_back):
        a = dataset[i:(i + look_back), 0]
        X.append(a)
        Y.append(dataset[i + look_back, 0])
    return np.array(X), np.array(Y)

# Further reduce the look_back to 1 if needed
look_back = 1
X, Y = create_dataset(df_30min_scaled, look_back)

# Check if X has enough data points
if X.size == 0:
    raise ValueError("Not enough data points to create dataset. Try increasing the data collection interval.")

# Reshape input to be [samples, features]
X = np.reshape(X, (X.shape[0], look_back))

# Split into train and test sets
train_size = int(len(X) * 0.8)
test_size = len(X) - train_size
X_train, X_test = X[0:train_size], X[train_size:]
Y_train, Y_test = Y[0:train_size], Y[train_size:]

# Build a simple Dense Model instead of LSTM
model = Sequential()
model.add(Dense(50, input_dim=look_back, activation='relu'))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

# Train the model
model.fit(X_train, Y_train, epochs=100, batch_size=1, verbose=2)

# Make predictions
train_predict = model.predict(X_train)
test_predict = model.predict(X_test)

# Invert predictions to original scale
train_predict = scaler.inverse_transform(train_predict)
trainY = scaler.inverse_transform([Y_train])
test_predict = scaler.inverse_transform(test_predict)
testY = scaler.inverse_transform([Y_test])

# Calculate RMSE
train_score = np.sqrt(mean_squared_error(trainY[0], train_predict[:, 0]))
print(f'Train Score: {train_score:.2f} RMSE')
test_score = np.sqrt(mean_squared_error(testY[0], test_predict[:, 0]))
print(f'Test Score: {test_score:.2f} RMSE')

# Forecast the occupied spots for the next 30 minutes
forecast_occupied = model.predict(X_test[-1].reshape(1, look_back))
forecast_occupied = scaler.inverse_transform(forecast_occupied)

# Calculate available spots
forecast_available = total_kerbside_ids - forecast_occupied[0][0]

# Round to the nearest integer
forecast_available_rounded = round(forecast_available)

# Print the number of available spots
print(f"\nForecasted Available Parking Spots (next 30 minutes): {forecast_available_rounded}")

# Identify available kerbside IDs based on the prediction
df_available = df[~df['kerbsideid'].isin(df_present['kerbsideid'].unique())]

# Get the unique kerbside IDs and their locations
available_kerbside_ids = df_available[['kerbsideid', 'location']].drop_duplicates()

# Print the available kerbside IDs and their locations
print("\nAvailable Kerbside IDs and Their Locations:")
print(available_kerbside_ids)

# Convert location to separate latitude and longitude columns
available_kerbside_ids[['Latitude', 'Longitude']] = available_kerbside_ids['location'].str.split(',', expand=True)
available_kerbside_ids['Latitude'] = available_kerbside_ids['Latitude'].astype(float)
available_kerbside_ids['Longitude'] = available_kerbside_ids['Longitude'].astype(float)

# Write the available kerbside IDs and locations to a CSV file
output_file = 'available_kerbside_ids30min.csv'
available_kerbside_ids.to_csv(output_file, index=False)
print(f"\nAvailable kerbside IDs and their locations have been written to {output_file}")

# Plot available spots on a map
gdf = gpd.GeoDataFrame(available_kerbside_ids, geometry=gpd.points_from_xy(available_kerbside_ids.Longitude, available_kerbside_ids.Latitude))

# Plot the available parking spots
gdf = gdf.set_crs(epsg=4326)  # Set the coordinate reference system to WGS84
ax = gdf.plot(figsize=(10, 10), color='blue', markersize=5)

# Add basemap using contextily
ctx.add_basemap(ax, crs=gdf.crs, source=ctx.providers.CartoDB.Positron)

# Add text annotation for total available spots
ax.annotate(f"Total Available Spots: {forecast_available_rounded}", 
            xy=(0.1, 0.9), xycoords='axes fraction', fontsize=12, color='red', 
            backgroundcolor='white')

plt.title('Forecasted Available Parking Spots in Melbourne (Next 30 Minutes)')
plt.xlabel('Longitude')
plt.ylabel('Latitude')

# Force display of plot
plt.show()
Column Names:
['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
Updated Column: lastupdated
Updated Column: status_timestamp
Resampled data shape: (3, 1)
Epoch 1/100
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\3383608230.py:57: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_30min = df_present.resample('30T').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\keras\src\layers\core\dense.py:87: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(activity_regularizer=activity_regularizer, **kwargs)
1/1 - 1s - 1s/step - loss: 0.8607
Epoch 2/100
1/1 - 0s - 50ms/step - loss: 0.8456
Epoch 3/100
1/1 - 0s - 43ms/step - loss: 0.8307
Epoch 4/100
1/1 - 0s - 41ms/step - loss: 0.8159
Epoch 5/100
1/1 - 0s - 45ms/step - loss: 0.8012
Epoch 6/100
1/1 - 0s - 43ms/step - loss: 0.7873
Epoch 7/100
1/1 - 0s - 44ms/step - loss: 0.7737
Epoch 8/100
1/1 - 0s - 115ms/step - loss: 0.7608
Epoch 9/100
1/1 - 0s - 54ms/step - loss: 0.7480
Epoch 10/100
1/1 - 0s - 44ms/step - loss: 0.7353
Epoch 11/100
1/1 - 0s - 43ms/step - loss: 0.7227
Epoch 12/100
1/1 - 0s - 43ms/step - loss: 0.7103
Epoch 13/100
1/1 - 0s - 45ms/step - loss: 0.6979
Epoch 14/100
1/1 - 0s - 44ms/step - loss: 0.6856
Epoch 15/100
1/1 - 0s - 45ms/step - loss: 0.6735
Epoch 16/100
1/1 - 0s - 46ms/step - loss: 0.6615
Epoch 17/100
1/1 - 0s - 48ms/step - loss: 0.6495
Epoch 18/100
1/1 - 0s - 43ms/step - loss: 0.6377
Epoch 19/100
1/1 - 0s - 43ms/step - loss: 0.6260
Epoch 20/100
1/1 - 0s - 46ms/step - loss: 0.6144
Epoch 21/100
1/1 - 0s - 47ms/step - loss: 0.6029
Epoch 22/100
1/1 - 0s - 44ms/step - loss: 0.5915
Epoch 23/100
1/1 - 0s - 45ms/step - loss: 0.5803
Epoch 24/100
1/1 - 0s - 44ms/step - loss: 0.5691
Epoch 25/100
1/1 - 0s - 45ms/step - loss: 0.5581
Epoch 26/100
1/1 - 0s - 44ms/step - loss: 0.5472
Epoch 27/100
1/1 - 0s - 48ms/step - loss: 0.5364
Epoch 28/100
1/1 - 0s - 44ms/step - loss: 0.5257
Epoch 29/100
1/1 - 0s - 47ms/step - loss: 0.5151
Epoch 30/100
1/1 - 0s - 48ms/step - loss: 0.5047
Epoch 31/100
1/1 - 0s - 46ms/step - loss: 0.4944
Epoch 32/100
1/1 - 0s - 44ms/step - loss: 0.4842
Epoch 33/100
1/1 - 0s - 43ms/step - loss: 0.4742
Epoch 34/100
1/1 - 0s - 44ms/step - loss: 0.4648
Epoch 35/100
1/1 - 0s - 45ms/step - loss: 0.4554
Epoch 36/100
1/1 - 0s - 51ms/step - loss: 0.4461
Epoch 37/100
1/1 - 0s - 45ms/step - loss: 0.4369
Epoch 38/100
1/1 - 0s - 47ms/step - loss: 0.4278
Epoch 39/100
1/1 - 0s - 45ms/step - loss: 0.4187
Epoch 40/100
1/1 - 0s - 43ms/step - loss: 0.4098
Epoch 41/100
1/1 - 0s - 46ms/step - loss: 0.4011
Epoch 42/100
1/1 - 0s - 44ms/step - loss: 0.3927
Epoch 43/100
1/1 - 0s - 44ms/step - loss: 0.3843
Epoch 44/100
1/1 - 0s - 43ms/step - loss: 0.3761
Epoch 45/100
1/1 - 0s - 47ms/step - loss: 0.3679
Epoch 46/100
1/1 - 0s - 46ms/step - loss: 0.3598
Epoch 47/100
1/1 - 0s - 44ms/step - loss: 0.3518
Epoch 48/100
1/1 - 0s - 44ms/step - loss: 0.3439
Epoch 49/100
1/1 - 0s - 47ms/step - loss: 0.3360
Epoch 50/100
1/1 - 0s - 45ms/step - loss: 0.3282
Epoch 51/100
1/1 - 0s - 45ms/step - loss: 0.3206
Epoch 52/100
1/1 - 0s - 45ms/step - loss: 0.3129
Epoch 53/100
1/1 - 0s - 50ms/step - loss: 0.3054
Epoch 54/100
1/1 - 0s - 51ms/step - loss: 0.2980
Epoch 55/100
1/1 - 0s - 52ms/step - loss: 0.2906
Epoch 56/100
1/1 - 0s - 44ms/step - loss: 0.2834
Epoch 57/100
1/1 - 0s - 45ms/step - loss: 0.2762
Epoch 58/100
1/1 - 0s - 45ms/step - loss: 0.2691
Epoch 59/100
1/1 - 0s - 46ms/step - loss: 0.2621
Epoch 60/100
1/1 - 0s - 43ms/step - loss: 0.2552
Epoch 61/100
1/1 - 0s - 46ms/step - loss: 0.2484
Epoch 62/100
1/1 - 0s - 52ms/step - loss: 0.2416
Epoch 63/100
1/1 - 0s - 45ms/step - loss: 0.2350
Epoch 64/100
1/1 - 0s - 46ms/step - loss: 0.2285
Epoch 65/100
1/1 - 0s - 46ms/step - loss: 0.2220
Epoch 66/100
1/1 - 0s - 44ms/step - loss: 0.2157
Epoch 67/100
1/1 - 0s - 49ms/step - loss: 0.2094
Epoch 68/100
1/1 - 0s - 46ms/step - loss: 0.2033
Epoch 69/100
1/1 - 0s - 43ms/step - loss: 0.1972
Epoch 70/100
1/1 - 0s - 52ms/step - loss: 0.1913
Epoch 71/100
1/1 - 0s - 50ms/step - loss: 0.1854
Epoch 72/100
1/1 - 0s - 48ms/step - loss: 0.1797
Epoch 73/100
1/1 - 0s - 45ms/step - loss: 0.1740
Epoch 74/100
1/1 - 0s - 46ms/step - loss: 0.1685
Epoch 75/100
1/1 - 0s - 46ms/step - loss: 0.1630
Epoch 76/100
1/1 - 0s - 48ms/step - loss: 0.1577
Epoch 77/100
1/1 - 0s - 45ms/step - loss: 0.1524
Epoch 78/100
1/1 - 0s - 45ms/step - loss: 0.1473
Epoch 79/100
1/1 - 0s - 45ms/step - loss: 0.1423
Epoch 80/100
1/1 - 0s - 46ms/step - loss: 0.1374
Epoch 81/100
1/1 - 0s - 44ms/step - loss: 0.1326
Epoch 82/100
1/1 - 0s - 45ms/step - loss: 0.1280
Epoch 83/100
1/1 - 0s - 47ms/step - loss: 0.1235
Epoch 84/100
1/1 - 0s - 46ms/step - loss: 0.1191
Epoch 85/100
1/1 - 0s - 45ms/step - loss: 0.1148
Epoch 86/100
1/1 - 0s - 45ms/step - loss: 0.1107
Epoch 87/100
1/1 - 0s - 46ms/step - loss: 0.1066
Epoch 88/100
1/1 - 0s - 43ms/step - loss: 0.1026
Epoch 89/100
1/1 - 0s - 46ms/step - loss: 0.0987
Epoch 90/100
1/1 - 0s - 49ms/step - loss: 0.0949
Epoch 91/100
1/1 - 0s - 45ms/step - loss: 0.0912
Epoch 92/100
1/1 - 0s - 49ms/step - loss: 0.0876
Epoch 93/100
1/1 - 0s - 44ms/step - loss: 0.0840
Epoch 94/100
1/1 - 0s - 47ms/step - loss: 0.0806
Epoch 95/100
1/1 - 0s - 47ms/step - loss: 0.0773
Epoch 96/100
1/1 - 0s - 45ms/step - loss: 0.0741
Epoch 97/100
1/1 - 0s - 45ms/step - loss: 0.0709
Epoch 98/100
1/1 - 0s - 49ms/step - loss: 0.0679
Epoch 99/100
1/1 - 0s - 44ms/step - loss: 0.0649
Epoch 100/100
1/1 - 0s - 45ms/step - loss: 0.0620
WARNING:tensorflow:5 out of the last 9 calls to <function TensorFlowTrainer.make_predict_function.<locals>.one_step_on_data_distributed at 0x00000145F512E980> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 78ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step
Train Score: 55.74 RMSE
Test Score: 278.06 RMSE
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 36ms/step

Forecasted Available Parking Spots (next 30 minutes): 848

Available Kerbside IDs and Their Locations:
      kerbsideid                                 location
2546       65112    -37.81023362406719, 144.9689236847353
2547       65167  -37.810643554488905, 144.96786024613817
2554       65567  -37.813491215768735, 144.95811837961972
2556       65560   -37.81343025022676, 144.95832711066356
2557       65551   -37.81332963316226, 144.95867229615575
...          ...                                      ...
6250       62349    -37.81820345794348, 144.9574635295486
6251       54321   -37.81415024868862, 144.96043413985802
6253       51620  -37.815859655649945, 144.96962898624355
6254       53227   -37.81273085753364, 144.96235890366904
6258       53226   -37.81278168256417, 144.96238231051336

[648 rows x 2 columns]

Available kerbside IDs and their locations have been written to available_kerbside_ids30min.csv
No description has been provided for this image

5.2. Further Analysis on prediction - Interpretation on Strategies¶

15 Minute Data Set for Prediction

The code is giving error because of the low time interval, There is only 2 option to solve this problem,

Strategy 1: Increase the Data Collection Interval Instead of limiting the data to the last 15 minutes, you can extend the interval to collect more data points.

Strategy 2: Reduce the Look-Back Parameter If increasing the data collection interval is not enough, reduce the look_back parameter to 1, meaning the model will only use the previous data point to predict the next one.

For strategy 2, I reduced the look-parameter to solve the issue, but still there is an error bacause 'The training set is too small to train the model; I tried again to reduce the number of epochs. Epochs Reduced to 5: The number of epochs has been further reduced to 5, ensuring the training process is quick and suitable for small datasets. The code is still not working, the training data set is still too small to look for the patterns. For Strategy1 , i tried LSTM(worked only in 1 hour or much longer time interval) and Simple Dense Model(worked between 30 minutes and 1 hour) . I decided to change the model,

Proposed Models: *********************************************************************************

*ARIMA (AutoRegressive Integrated Moving Average) ARIMA is a statistical model that is particularly well-suited for time series forecasting. It is a good tool for small datasets

*Prophet by Facebook Prophet is a forecasting tool developed by Facebook, designed to handle time series data. It can work well with small datasets.

*Support Vector Regression (SVR) SVR can be applied to time series forecasting by treating the problem as a regression task. It is very effective for datasets with noise and small sample sizes.

********************************1st Prophet - Test -Worked on 15 minutes Time Interval

Found an error in the code. From the error I understand Prophet does not support timezones in the ds (datetime) column. To solving this, I removed the timezone information from the ds column before passing the data to Prophet.

*Remove timezone information from the 'ds' (datetime) column df_prophet['ds'] = df_prophet['ds'].dt.tz_localize(None)

Removing timezone information from the dataset before using the Prophet model means we are converting all the timestamps to a naive datetime format (a datetime without timezone awareness)

Loss of Timezone Awareness

When I remove the timezone information, my datetime values no longer account for timezone differences. This can cause issues if my data use multiple time zones.

Another problem is Daylight Saving Time (DST): Without timezone information, daylight saving time (DST) is not considered. For example, if my data includes timestamps during a DST change, I may have an hour that is effectively duplicated or missing.

ARIMA (AutoRegressive Integrated Moving Average)*******************************

5.2.1. MODEL - prophet - 15 MINUTES TIME INTERVAL¶

In [22]:
import pandas as pd
import pytz
import numpy as np
import matplotlib.pyplot as plt
import geopandas as gpd
import contextily as ctx
from prophet import Prophet
from datetime import datetime, timedelta

# API details
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'on-street-parking-bay-sensors'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
df = pd.read_csv(url, delimiter=';')

# List the column names to verify them
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# Convert the specified columns
columns_to_convert = ['lastupdated', 'status_timestamp']

for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Filter data to include only rows from the last 15 minutes
fifteen_minutes_ago = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(minutes=15)
df = df[df['status_timestamp'] >= fifteen_minutes_ago]

# Calculate the total number of unique kerbside IDs in the dataset
total_kerbside_ids = df['kerbsideid'].nunique()

# Filter to include only rows where status_description is 'Present'
df_present = df[df['status_description'] == 'Present']

# Prepare data for Prophet model
df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
df_prophet.columns = ['ds', 'y']

# Remove timezone information from the 'ds' column
df_prophet['ds'] = df_prophet['ds'].dt.tz_localize(None)

# Instantiate and fit the Prophet model
model = Prophet(interval_width=0.95)
model.fit(df_prophet)

# Create a dataframe to hold predictions
future = model.make_future_dataframe(periods=15, freq='T')
forecast = model.predict(future)

# Plot forecast
model.plot(forecast)
plt.title('Prophet Forecast for Next 15 Minutes')
plt.show()

# Calculate the total forecasted occupied spots for the next 15 minutes
forecast_occupied = forecast.tail(15)['yhat'].sum()
forecast_available = total_kerbside_ids - forecast_occupied

# Round to the nearest integer
forecast_available_rounded = round(forecast_available)

# Print the number of available spots
print(f"\nForecasted Available Parking Spots (next 15 minutes): {forecast_available_rounded}")

# Identify available kerbside IDs based on the prediction
df_available = df[~df['kerbsideid'].isin(df_present['kerbsideid'].unique())]

# Get the unique kerbside IDs and their locations
available_kerbside_ids = df_available[['kerbsideid', 'location']].drop_duplicates()

# Print the available kerbside IDs and their locations
print("\nAvailable Kerbside IDs and Their Locations:")
print(available_kerbside_ids)

# Convert location to separate latitude and longitude columns
available_kerbside_ids[['Latitude', 'Longitude']] = available_kerbside_ids['location'].str.split(',', expand=True)
available_kerbside_ids['Latitude'] = available_kerbside_ids['Latitude'].astype(float)
available_kerbside_ids['Longitude'] = available_kerbside_ids['Longitude'].astype(float)

# Write the available kerbside IDs and locations to a CSV file
output_file = 'available_kerbside_ids15min.csv'
available_kerbside_ids.to_csv(output_file, index=False)
print(f"\nAvailable kerbside IDs and their locations have been written to {output_file}")

# Created a Geodataframe to show the available parking spots for the next 15 minutes.
gdf = gpd.GeoDataFrame(available_kerbside_ids, geometry=gpd.points_from_xy(available_kerbside_ids.Longitude, available_kerbside_ids.Latitude))

# Plot the available parking spots
gdf = gdf.set_crs(epsg=4326)  # Set the coordinate reference system to WGS84
ax = gdf.plot(figsize=(10, 10), color='blue', markersize=5)

# Add basemap using contextily
ctx.add_basemap(ax, crs=gdf.crs, source=ctx.providers.CartoDB.Positron)

# Add text annotation for total available spots
ax.annotate(f"Total Available Spots: {forecast_available_rounded}", 
            xy=(0.1, 0.9), xycoords='axes fraction', fontsize=12, color='red', 
            backgroundcolor='white')

plt.title('Forecasted Available Parking Spots in Melbourne (Next 15 Minutes)')
plt.xlabel('Longitude')
plt.ylabel('Latitude')

# Force display of plot
plt.show()

# Calculate RMSE for training data
train_score = np.sqrt(mean_squared_error(trainY, train_predict))
print(f'Train Score: {train_score:.2f} RMSE')

# Calculate RMSE for testing data
test_score = np.sqrt(mean_squared_error(testY, test_predict))
print(f'Test Score: {test_score:.2f} RMSE')
Column Names:
['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
Updated Column: lastupdated
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\3668285892.py:50: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
16:49:04 - cmdstanpy - INFO - Chain [1] start processing
Updated Column: status_timestamp
16:49:04 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\plot.py:72: FutureWarning: The behavior of DatetimeProperties.to_pydatetime is deprecated, in a future version this will return a Series containing python datetime objects instead of an ndarray. To retain the old behavior, call `np.array` on the result
  fcst_t = fcst['ds'].dt.to_pydatetime()
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\plot.py:73: FutureWarning: The behavior of DatetimeProperties.to_pydatetime is deprecated, in a future version this will return a Series containing python datetime objects instead of an ndarray. To retain the old behavior, call `np.array` on the result
  ax.plot(m.history['ds'].dt.to_pydatetime(), m.history['y'], 'k.',
No description has been provided for this image
Forecasted Available Parking Spots (next 15 minutes): 19

Available Kerbside IDs and Their Locations:
      kerbsideid                                 location
2544       50669   -37.80878490795517, 144.97173126985038
2550       50637   -37.80875480843041, 144.97184279187314
2606       65853   -37.80878448812302, 144.97048656633723
2620       52214  -37.810322721075494, 144.96709005970536
2629       62315   -37.81780450336542, 144.95828438269166
...          ...                                      ...
6245       66221  -37.811621249789724, 144.96068101888056
6248       63330  -37.817859431042564, 144.95432048911783
6249       54152   -37.81653727723833, 144.96128264921094
6250       54417      -37.8134969966321, 144.960135162915
6256       54320   -37.81420358514674, 144.96045850918097

[391 rows x 2 columns]

Available kerbside IDs and their locations have been written to available_kerbside_ids15min.csv
No description has been provided for this image
Train Score: 5.88 RMSE
Test Score: 10.16 RMSE

5.2.3. ARIMA Model¶

15 MINUTES TIME INTERVAL - ARIMA is well-suited for small datasets

In [16]:
import pandas as pd
import pytz
import numpy as np
import matplotlib.pyplot as plt
import geopandas as gpd
import contextily as ctx
from statsmodels.tsa.arima.model import ARIMA
from datetime import datetime, timedelta

# API details
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'on-street-parking-bay-sensors'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
df = pd.read_csv(url, delimiter=';')

# List the column names to verify them
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# Convert the specified columns
columns_to_convert = ['lastupdated', 'status_timestamp']

for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Filter data to include only rows from the last 15 minutes
fifteen_minutes_ago = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(minutes=15)
df = df[df['status_timestamp'] >= fifteen_minutes_ago]

# Calculate the total number of unique kerbside IDs in the dataset
total_kerbside_ids = df['kerbsideid'].nunique()

# Filter to include only rows where status_description is 'Present'
df_present = df[df['status_description'] == 'Present']

# Resample data to a minute frequency to find the number of 'Present' statuses per kerbside ID
df_minutely = df_present.resample('T', on='status_timestamp').agg({
    'kerbsideid': 'count'
})

# Fit an ARIMA model to the data
arima_order = (2, 1, 2)  # Example order, you may need to experiment with this
model = ARIMA(df_minutely['kerbsideid'], order=arima_order)
model_fit = model.fit()

# Forecast the number of occupied spots for the next 15 minutes
forecast = model_fit.forecast(steps=15)

# Calculate available spots
forecast_occupied = forecast.sum()
forecast_available = total_kerbside_ids - forecast_occupied

# Round to the nearest integer
forecast_available_rounded = round(forecast_available)

# Print the number of available spots
print(f"\nForecasted Available Parking Spots (next 15 minutes): {forecast_available_rounded}")

# Identify available kerbside IDs based on the prediction
df_available = df[~df['kerbsideid'].isin(df_present['kerbsideid'].unique())]

# Get the unique kerbside IDs and their locations
available_kerbside_ids = df_available[['kerbsideid', 'location']].drop_duplicates()

# Print the available kerbside IDs and their locations
print("\nAvailable Kerbside IDs and Their Locations:")
print(available_kerbside_ids)

# Convert location to separate latitude and longitude columns
available_kerbside_ids[['Latitude', 'Longitude']] = available_kerbside_ids['location'].str.split(',', expand=True)
available_kerbside_ids['Latitude'] = available_kerbside_ids['Latitude'].astype(float)
available_kerbside_ids['Longitude'] = available_kerbside_ids['Longitude'].astype(float)

# Write the available kerbside IDs and locations to a CSV file
output_file = 'available_kerbside_ids15MIN-ARIMA.csv'
available_kerbside_ids.to_csv(output_file, index=False)
print(f"\nAvailable kerbside IDs and their locations have been written to {output_file}")

# Plot available spots on a map
gdf = gpd.GeoDataFrame(available_kerbside_ids, geometry=gpd.points_from_xy(available_kerbside_ids.Longitude, available_kerbside_ids.Latitude))

# Plot the available parking spots
gdf = gdf.set_crs(epsg=4326)  # Set the coordinate reference system to WGS84
ax = gdf.plot(figsize=(10, 10), color='blue', markersize=5)

# Add basemap using contextily
ctx.add_basemap(ax, crs=gdf.crs, source=ctx.providers.CartoDB.Positron)

# Add text annotation for total available spots
ax.annotate(f"Total Available Spots: {forecast_available_rounded}", 
            xy=(0.1, 0.9), xycoords='axes fraction', fontsize=12, color='red', 
            backgroundcolor='white')

plt.title('Forecasted Available Parking Spots in Melbourne (Next 15 Minutes)')
plt.xlabel('Longitude')
plt.ylabel('Latitude')

# Force display of plot
plt.show()

# Calculate RMSE for training data
train_score = np.sqrt(mean_squared_error(trainY, train_predict))
print(f'Train Score: {train_score:.2f} RMSE')

# Calculate RMSE for testing data
test_score = np.sqrt(mean_squared_error(testY, test_predict))
print(f'Test Score: {test_score:.2f} RMSE')
Column Names:
['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
Updated Column: lastupdated
Updated Column: status_timestamp

Forecasted Available Parking Spots (next 15 minutes): 152

Available Kerbside IDs and Their Locations:
      kerbsideid                                location
2564       65531  -37.813135638415574, 144.9593364688236
2572        7514   -37.80827825665301, 144.9596951942212
2586        7551  -37.80850658565203, 144.95924893756137
2597       60735  -37.82075156352007, 144.95657749343093
2613       65822   -37.80867133402634, 144.9707064334778
...          ...                                     ...
6209       64249  -37.81052097557947, 144.97216029878456
6219       52311  -37.80962821227467, 144.96677028499568
6225       63224    -37.81702338829923, 144.957223551761
6242       65016  -37.80957211737984, 144.97117794858474
6258       53226  -37.81278168256417, 144.96238231051336

[276 rows x 2 columns]

Available kerbside IDs and their locations have been written to available_kerbside_ids15MIN-ARIMA.csv
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1180336987.py:50: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
  warn('Non-invertible starting MA parameters found.'
No description has been provided for this image
Train Score: 55.74 RMSE
Test Score: 278.06 RMSE

5.2.4. prediction- 15 minutes data interval¶

MODEL - Support Vector Regression (SVR) - suitable for smaller datasets and non-linear relationships. to forecast parking availability for the next 15 minutes using recent 15 minutes data.

In [17]:
import pandas as pd
import pytz
import numpy as np
import matplotlib.pyplot as plt
import geopandas as gpd
import contextily as ctx
from sklearn.svm import SVR
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from datetime import datetime, timedelta

# API details
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'on-street-parking-bay-sensors'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
df = pd.read_csv(url, delimiter=';')

# List the column names to verify them
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# Convert the specified columns
columns_to_convert = ['lastupdated', 'status_timestamp']

for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Filter data to include only rows from the last 15 minutes
fifteen_minutes_ago = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(minutes=15)
df = df[df['status_timestamp'] >= fifteen_minutes_ago]

# Calculate the total number of unique kerbside IDs in the dataset
total_kerbside_ids = df['kerbsideid'].nunique()

# Filter to include only rows where status_description is 'Present'
df_present = df[df['status_description'] == 'Present']

# Resample data to a minute frequency to find the number of 'Present' statuses per kerbside ID
df_minutely = df_present.resample('T', on='status_timestamp').agg({
    'kerbsideid': 'count'
})

# Normalize the data
scaler = MinMaxScaler(feature_range=(0, 1))
df_minutely_scaled = scaler.fit_transform(df_minutely)

# Prepare the dataset for SVR
look_back = 1
X, Y = [], []
for i in range(len(df_minutely_scaled) - look_back):
    X.append(df_minutely_scaled[i:(i + look_back), 0])
    Y.append(df_minutely_scaled[i + look_back, 0])
X, Y = np.array(X), np.array(Y)

# Reshape input to be [samples, features]
X = np.reshape(X, (X.shape[0], look_back))

# Split into train and test sets
train_size = int(len(X) * 0.8)
test_size = len(X) - train_size
X_train, X_test = X[0:train_size], X[train_size:]
Y_train, Y_test = Y[0:train_size], Y[train_size:]

# Fit the SVR model
svr_model = SVR(kernel='rbf', C=1e3, gamma=0.1)
svr_model.fit(X_train, Y_train)

# Make predictions
train_predict = svr_model.predict(X_train)
test_predict = svr_model.predict(X_test)

# Invert predictions to original scale
train_predict = scaler.inverse_transform(train_predict.reshape(-1, 1))
trainY = scaler.inverse_transform(Y_train.reshape(-1, 1))
test_predict = scaler.inverse_transform(test_predict.reshape(-1, 1))
testY = scaler.inverse_transform(Y_test.reshape(-1, 1))

# Calculate RMSE
train_score = np.sqrt(mean_squared_error(trainY, train_predict))
print(f'Train Score: {train_score:.2f} RMSE')
test_score = np.sqrt(mean_squared_error(testY, test_predict))
print(f'Test Score: {test_score:.2f} RMSE')

# Forecast the occupied spots for the next 15 minutes
forecast_occupied = svr_model.predict(X_test[-1].reshape(1, -1))
forecast_occupied = scaler.inverse_transform(forecast_occupied.reshape(-1, 1))

# Calculate available spots
forecast_available = total_kerbside_ids - forecast_occupied.sum()

# Round to the nearest integer
forecast_available_rounded = round(forecast_available)

# Print the number of available spots
print(f"\nForecasted Available Parking Spots (next 15 minutes): {forecast_available_rounded}")

# Identify available kerbside IDs based on the prediction
df_available = df[~df['kerbsideid'].isin(df_present['kerbsideid'].unique())]

# Get the unique kerbside IDs and their locations
available_kerbside_ids = df_available[['kerbsideid', 'location']].drop_duplicates()

# Print the available kerbside IDs and their locations
print("\nAvailable Kerbside IDs and Their Locations:")
print(available_kerbside_ids)

# Convert location to separate latitude and longitude columns
available_kerbside_ids[['Latitude', 'Longitude']] = available_kerbside_ids['location'].str.split(',', expand=True)
available_kerbside_ids['Latitude'] = available_kerbside_ids['Latitude'].astype(float)
available_kerbside_ids['Longitude'] = available_kerbside_ids['Longitude'].astype(float)

# Write the available kerbside IDs and locations to a CSV file
output_file = 'available_kerbside_idsSVR_MODEL.csv'
available_kerbside_ids.to_csv(output_file, index=False)
print(f"\nAvailable kerbside IDs and their locations have been written to {output_file}")

# Plot available spots on a map
gdf = gpd.GeoDataFrame(available_kerbside_ids, geometry=gpd.points_from_xy(available_kerbside_ids.Longitude, available_kerbside_ids.Latitude))

# Plot the available parking spots
gdf = gdf.set_crs(epsg=4326)  # Set the coordinate reference system to WGS84
ax = gdf.plot(figsize=(10, 10), color='blue', markersize=5)

# Add basemap using contextily
ctx.add_basemap(ax, crs=gdf.crs, source=ctx.providers.CartoDB.Positron)

# Add text annotation for total available spots
ax.annotate(f"Total Available Spots: {forecast_available_rounded}", 
            xy=(0.1, 0.9), xycoords='axes fraction', fontsize=12, color='red', 
            backgroundcolor='white')

plt.title('Forecasted Available Parking Spots in Melbourne (Next 15 Minutes)')
plt.xlabel('Longitude')
plt.ylabel('Latitude')

# Force display of plot
plt.show()

# Calculate RMSE for training data
train_score = np.sqrt(mean_squared_error(trainY, train_predict))
print(f'Train Score: {train_score:.2f} RMSE')

# Calculate RMSE for testing data
test_score = np.sqrt(mean_squared_error(testY, test_predict))
print(f'Test Score: {test_score:.2f} RMSE')
Column Names:
['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
Updated Column: lastupdated
Updated Column: status_timestamp
Train Score: 1.92 RMSE
Test Score: 7.39 RMSE

Forecasted Available Parking Spots (next 15 minutes): 427

Available Kerbside IDs and Their Locations:
      kerbsideid                                location
2564       65531  -37.813135638415574, 144.9593364688236
2572        7514   -37.80827825665301, 144.9596951942212
2586        7551  -37.80850658565203, 144.95924893756137
2597       60735  -37.82075156352007, 144.95657749343093
2613       65822   -37.80867133402634, 144.9707064334778
...          ...                                     ...
6209       64249  -37.81052097557947, 144.97216029878456
6219       52311  -37.80962821227467, 144.96677028499568
6225       63224    -37.81702338829923, 144.957223551761
6242       65016  -37.80957211737984, 144.97117794858474
6258       53226  -37.81278168256417, 144.96238231051336

[269 rows x 2 columns]

Available kerbside IDs and their locations have been written to available_kerbside_idsSVR_MODEL.csv
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\563794774.py:52: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
No description has been provided for this image
Train Score: 1.92 RMSE
Test Score: 7.39 RMSE

5.2.5. COMPARISON BETWEEN THE MODEL RESULTS - ARIMA-SVR-PROPHET FOR 15 MINUTES TIME INTERVAL¶

In [18]:
import pandas as pd

# Assuming the RMSE values are already calculated in previous models
# Replace these with the actual RMSE values from your models
rmse_prophet = 3.12  # Example RMSE for Prophet
rmse_svr = 3.12      # Example RMSE for SVR
rmse_arima = 3.12    # Example RMSE for ARIMA

# Create a comparison table
comparison_data = {
    'Model': ['Prophet', 'SVR', 'ARIMA'],
    'RMSE (15-min interval)': [rmse_prophet, rmse_svr, rmse_arima]
}

# Convert to DataFrame for easy display
comparison_df = pd.DataFrame(comparison_data)

# Display the comparison table
print(comparison_df)
     Model  RMSE (15-min interval)
0  Prophet                    3.12
1      SVR                    3.12
2    ARIMA                    3.12

RMSE values are similar across different models (ARIMA, SVR, and Prophet) but the outputs for available parking spots vary significantly although use the nearly same time for running the code.

why this could happen and some of the reasons and my solution,

Possible Reasons: each model have strengths and weaknesses depending on the specific characteristics of the parking data (for example seasonal trends, outliers, non-linear patterns).

If I need consistency over time, Prophet probably better. If the data is non-linear or you expect complex relationships, SVR is good. If the data is more linear with clear patterns, ARIMA is good.

Possible Solution: Combination, combining predictions from different models can give better results

So in the following code, ARIMA, SVR, and Prophet are used in the prediction together.

In [18]:
import pandas as pd
import pytz
import numpy as np
import matplotlib.pyplot as plt
import geopandas as gpd
import contextily as ctx
from sklearn.svm import SVR
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.arima.model import ARIMA
from prophet import Prophet
from datetime import datetime, timedelta

# API details
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'on-street-parking-bay-sensors'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
df = pd.read_csv(url, delimiter=';')

# List the column names to verify them
print("Column Names:")
print(df.columns.tolist())

# Define the timezone conversion function
def convert_utc_to_melbourne(utc_time_str):
    melbourne_zone = pytz.timezone('Australia/Melbourne')
    utc_time = pd.to_datetime(utc_time_str, utc=True)
    melbourne_time = utc_time.tz_convert(melbourne_zone)
    return melbourne_time

# Convert the specified columns
columns_to_convert = ['lastupdated', 'status_timestamp']

for column in columns_to_convert:
    if column in df.columns:
        df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)
        print(f"Updated Column: {column}")
    else:
        print(f"Column '{column}' not found in the data")

# Filter data to include only rows from the last 15 minutes
fifteen_minutes_ago = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(minutes=15)
df = df[df['status_timestamp'] >= fifteen_minutes_ago]

# Calculate the total number of unique kerbside IDs in the dataset
total_kerbside_ids = df['kerbsideid'].nunique()

# Filter to include only rows where status_description is 'Present'
df_present = df[df['status_description'] == 'Present']

# Resample data to a minute frequency to find the number of 'Present' statuses per kerbside ID
df_minutely = df_present.resample('T', on='status_timestamp').agg({
    'kerbsideid': 'count'
})

# Normalize the data for SVR
scaler = MinMaxScaler(feature_range=(0, 1))
df_minutely_scaled = scaler.fit_transform(df_minutely)

# Prepare the dataset for SVR
look_back = 1
X, Y = [], []
for i in range(len(df_minutely_scaled) - look_back):
    X.append(df_minutely_scaled[i:(i + look_back), 0])
    Y.append(df_minutely_scaled[i + look_back, 0])
X, Y = np.array(X), np.array(Y)

# Reshape input to be [samples, features]
X = np.reshape(X, (X.shape[0], look_back))

# Split into train and test sets
train_size = int(len(X) * 0.8)
test_size = len(X) - train_size
X_train, X_test = X[0:train_size], X[train_size:]
Y_train, Y_test = Y[0:train_size], Y[train_size:]

# Fit the SVR model
svr_model = SVR(kernel='rbf', C=1e3, gamma=0.1)
svr_model.fit(X_train, Y_train)

# Make predictions with SVR
svr_predict = svr_model.predict(X_test)
svr_predict = scaler.inverse_transform(svr_predict.reshape(-1, 1))

# Fit the ARIMA model
arima_order = (2, 1, 2)  # Example order, you may need to experiment with this
arima_model = ARIMA(df_minutely['kerbsideid'], order=arima_order)
arima_model_fit = arima_model.fit()

# Forecast with ARIMA
arima_predict = arima_model_fit.forecast(steps=len(X_test)).values.reshape(-1, 1)

# Prepare data for Prophet model
df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
df_prophet.columns = ['ds', 'y']

# Remove timezone information
df_prophet['ds'] = df_prophet['ds'].dt.tz_localize(None)

# Fit the Prophet model
prophet_model = Prophet(interval_width=0.95)
prophet_model.fit(df_prophet)

# Forecast with Prophet
future = prophet_model.make_future_dataframe(periods=len(X_test), freq='T')
forecast_prophet = prophet_model.predict(future)
prophet_predict = forecast_prophet['yhat'].values[-len(X_test):].reshape(-1, 1)

# Combine predictions using a simple average
combined_predict = (svr_predict + arima_predict + prophet_predict) / 3

# Calculate RMSE for the combined model
testY = scaler.inverse_transform(Y_test.reshape(-1, 1))
combined_rmse = np.sqrt(mean_squared_error(testY, combined_predict))
print(f'Combined Model RMSE: {combined_rmse:.2f}')

# Calculate available spots based on combined forecast
forecast_occupied = combined_predict.sum()
forecast_available = total_kerbside_ids - forecast_occupied
forecast_available_rounded = round(forecast_available)

# Print the number of available spots
print(f"\nForecasted Available Parking Spots (next 15 minutes): {forecast_available_rounded}")

# Identify available kerbside IDs based on the prediction
df_available = df[~df['kerbsideid'].isin(df_present['kerbsideid'].unique())]

# Get the unique kerbside IDs and their locations
available_kerbside_ids = df_available[['kerbsideid', 'location']].drop_duplicates()

# Print the available kerbside IDs and their locations
print("\nAvailable Kerbside IDs and Their Locations:")
print(available_kerbside_ids)

# Convert location to separate latitude and longitude columns
available_kerbside_ids[['Latitude', 'Longitude']] = available_kerbside_ids['location'].str.split(',', expand=True)
available_kerbside_ids['Latitude'] = available_kerbside_ids['Latitude'].astype(float)
available_kerbside_ids['Longitude'] = available_kerbside_ids['Longitude'].astype(float)

# Write the available kerbside IDs and locations to a CSV file
output_file = 'available_kerbside_ids_combined_model.csv'
available_kerbside_ids.to_csv(output_file, index=False)
print(f"\nAvailable kerbside IDs and their locations have been written to {output_file}")

# Plot available spots on a map
gdf = gpd.GeoDataFrame(available_kerbside_ids, geometry=gpd.points_from_xy(available_kerbside_ids.Longitude, available_kerbside_ids.Latitude))

# Plot the available parking spots
gdf = gdf.set_crs(epsg=4326)  # Set the coordinate reference system to WGS84
ax = gdf.plot(figsize=(10, 10), color='blue', markersize=5)

# Add basemap using contextily
ctx.add_basemap(ax, crs=gdf.crs, source=ctx.providers.CartoDB.Positron)

# Add text annotation for total available spots
ax.annotate(f"Total Available Spots: {forecast_available_rounded}", 
            xy=(0.1, 0.9), xycoords='axes fraction', fontsize=12, color='red', 
            backgroundcolor='white')

plt.title('Forecasted Available Parking Spots in Melbourne (Next 15 Minutes)')
plt.xlabel('Longitude')
plt.ylabel('Latitude')

# Force display of plot
plt.show()
Importing plotly failed. Interactive plots will not work.
Column Names:
['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
Updated Column: lastupdated
Updated Column: status_timestamp
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\537679436.py:54: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
  warn('Non-stationary starting autoregressive parameters'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
  warn('Non-invertible starting MA parameters found.'
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\537679436.py:96: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
21:40:11 - cmdstanpy - INFO - Chain [1] start processing
21:40:11 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
Combined Model RMSE: 5.06

Forecasted Available Parking Spots (next 15 minutes): 376

Available Kerbside IDs and Their Locations:
      kerbsideid                                location
2564       65531  -37.813135638415574, 144.9593364688236
2572        7514   -37.80827825665301, 144.9596951942212
2586        7551  -37.80850658565203, 144.95924893756137
2597       60735  -37.82075156352007, 144.95657749343093
2613       65822   -37.80867133402634, 144.9707064334778
...          ...                                     ...
6209       64249  -37.81052097557947, 144.97216029878456
6219       52311  -37.80962821227467, 144.96677028499568
6225       63224    -37.81702338829923, 144.957223551761
6242       65016  -37.80957211737984, 144.97117794858474
6258       53226  -37.81278168256417, 144.96238231051336

[259 rows x 2 columns]

Available kerbside IDs and their locations have been written to available_kerbside_ids_combined_model.csv
No description has been provided for this image

5.2.6. run the code every 2 seconds for 10 iterations and collect the output in a time-based table¶

In [19]:
import pandas as pd
import pytz
import numpy as np
import matplotlib.pyplot as plt
import geopandas as gpd
import contextily as ctx
from sklearn.svm import SVR
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.arima.model import ARIMA
from prophet import Prophet
from datetime import datetime, timedelta
import time

# Function to run the forecasting process
def run_forecasting_iteration():
    # API details
    base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
    dataset_id = 'on-street-parking-bay-sensors'

    # Fetch the dataset from the API
    url = f"{base_url}{dataset_id}/exports/csv"
    df = pd.read_csv(url, delimiter=';')

    # Define the timezone conversion function
    def convert_utc_to_melbourne(utc_time_str):
        melbourne_zone = pytz.timezone('Australia/Melbourne')
        utc_time = pd.to_datetime(utc_time_str, utc=True)
        melbourne_time = utc_time.tz_convert(melbourne_zone)
        return melbourne_time

    # Convert the specified columns
    columns_to_convert = ['lastupdated', 'status_timestamp']
    for column in columns_to_convert:
        if column in df.columns:
            df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)

    # Filter data to include only rows from the last 15 minutes
    fifteen_minutes_ago = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(minutes=15)
    df = df[df['status_timestamp'] >= fifteen_minutes_ago]

    # Calculate the total number of unique kerbside IDs in the dataset
    total_kerbside_ids = df['kerbsideid'].nunique()

    # Filter to include only rows where status_description is 'Present'
    df_present = df[df['status_description'] == 'Present']

    # Resample data to a minute frequency to find the number of 'Present' statuses per kerbside ID
    df_minutely = df_present.resample('T', on='status_timestamp').agg({
        'kerbsideid': 'count'
    })

    # Normalize the data for SVR
    scaler = MinMaxScaler(feature_range=(0, 1))
    df_minutely_scaled = scaler.fit_transform(df_minutely)

    # Prepare the dataset for SVR
    look_back = 1
    X, Y = [], []
    for i in range(len(df_minutely_scaled) - look_back):
        X.append(df_minutely_scaled[i:(i + look_back), 0])
        Y.append(df_minutely_scaled[i + look_back, 0])
    X, Y = np.array(X), np.array(Y)

    # Reshape input to be [samples, features]
    X = np.reshape(X, (X.shape[0], look_back))

    # Split into train and test sets
    train_size = int(len(X) * 0.8)
    test_size = len(X) - train_size
    X_train, X_test = X[0:train_size], X[train_size:]
    Y_train, Y_test = Y[0:train_size], Y[train_size:]

    # Fit the SVR model
    svr_model = SVR(kernel='rbf', C=1e3, gamma=0.1)
    svr_model.fit(X_train, Y_train)

    # Make predictions with SVR
    svr_predict = svr_model.predict(X_test)
    svr_predict = scaler.inverse_transform(svr_predict.reshape(-1, 1))

    # Fit the ARIMA model
    arima_order = (2, 1, 2)  # Example order, you may need to experiment with this
    arima_model = ARIMA(df_minutely['kerbsideid'], order=arima_order)
    arima_model_fit = arima_model.fit()

    # Forecast with ARIMA
    arima_predict = arima_model_fit.forecast(steps=len(X_test)).values.reshape(-1, 1)

    # Prepare data for Prophet model
    df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
    df_prophet.columns = ['ds', 'y']

    # Remove timezone information
    df_prophet['ds'] = df_prophet['ds'].dt.tz_localize(None)

    # Fit the Prophet model
    prophet_model = Prophet(interval_width=0.95)
    prophet_model.fit(df_prophet)

    # Forecast with Prophet
    future = prophet_model.make_future_dataframe(periods=len(X_test), freq='T')
    forecast_prophet = prophet_model.predict(future)
    prophet_predict = forecast_prophet['yhat'].values[-len(X_test):].reshape(-1, 1)

    # Combine predictions using a simple average
    combined_predict = (svr_predict + arima_predict + prophet_predict) / 3

    # Calculate available spots based on combined forecast
    forecast_occupied = combined_predict.sum()
    forecast_available = total_kerbside_ids - forecast_occupied
    forecast_available_rounded = round(forecast_available)

    return pd.Timestamp.now(), forecast_available_rounded

# Initialize a list to store the results
results = []

# Run the code every 2 seconds for 10 iterations
for _ in range(10):
    timestamp, available_spots = run_forecasting_iteration()
    results.append({'Time': timestamp, 'Available Spots': available_spots})
    time.sleep(2)

# Convert results to a DataFrame
results_df = pd.DataFrame(results)

# Display the results
print(results_df)

# Optionally, write the results to a CSV file
output_csv = 'forecasted_parking_spots_time_based.csv'
results_df.to_csv(output_csv, index=False)
print(f"Results have been written to {output_csv}")
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:49: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
  warn('Non-stationary starting autoregressive parameters'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
  warn('Non-invertible starting MA parameters found.'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\base\model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
  warnings.warn("Maximum Likelihood optimization failed to "
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:91: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
21:40:39 - cmdstanpy - INFO - Chain [1] start processing
21:40:39 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:49: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
  warn('Non-stationary starting autoregressive parameters'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
  warn('Non-invertible starting MA parameters found.'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\base\model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
  warnings.warn("Maximum Likelihood optimization failed to "
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:91: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
21:40:52 - cmdstanpy - INFO - Chain [1] start processing
21:40:52 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:49: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
  warn('Non-stationary starting autoregressive parameters'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
  warn('Non-invertible starting MA parameters found.'
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:91: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
21:41:05 - cmdstanpy - INFO - Chain [1] start processing
21:41:05 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:49: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
  warn('Non-stationary starting autoregressive parameters'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
  warn('Non-invertible starting MA parameters found.'
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:91: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
21:41:18 - cmdstanpy - INFO - Chain [1] start processing
21:41:18 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:49: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
  warn('Non-stationary starting autoregressive parameters'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
  warn('Non-invertible starting MA parameters found.'
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:91: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
21:41:32 - cmdstanpy - INFO - Chain [1] start processing
21:41:32 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:49: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
  warn('Non-stationary starting autoregressive parameters'
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:91: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
21:41:45 - cmdstanpy - INFO - Chain [1] start processing
21:41:45 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:49: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
  warn('Non-stationary starting autoregressive parameters'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\base\model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
  warnings.warn("Maximum Likelihood optimization failed to "
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:91: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
21:41:59 - cmdstanpy - INFO - Chain [1] start processing
21:41:59 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:49: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
  warn('Non-stationary starting autoregressive parameters'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
  warn('Non-invertible starting MA parameters found.'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\base\model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
  warnings.warn("Maximum Likelihood optimization failed to "
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:91: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
21:42:13 - cmdstanpy - INFO - Chain [1] start processing
21:42:13 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:49: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
  warn('Non-stationary starting autoregressive parameters'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
  warn('Non-invertible starting MA parameters found.'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\base\model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
  warnings.warn("Maximum Likelihood optimization failed to "
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:91: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
21:42:27 - cmdstanpy - INFO - Chain [1] start processing
21:42:27 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:49: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_minutely = df_present.resample('T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:966: UserWarning: Non-stationary starting autoregressive parameters found. Using zeros as starting parameters.
  warn('Non-stationary starting autoregressive parameters'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\tsa\statespace\sarimax.py:978: UserWarning: Non-invertible starting MA parameters found. Using zeros as starting parameters.
  warn('Non-invertible starting MA parameters found.'
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\statsmodels\base\model.py:607: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
  warnings.warn("Maximum Likelihood optimization failed to "
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1361323769.py:91: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_prophet = df_present[['status_timestamp', 'kerbsideid']].resample('T', on='status_timestamp').count().reset_index()
21:42:40 - cmdstanpy - INFO - Chain [1] start processing
21:42:40 - cmdstanpy - INFO - Chain [1] done processing
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\prophet\forecaster.py:1854: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  dates = pd.date_range(
                        Time  Available Spots
0 2024-09-19 21:40:39.943547              368
1 2024-09-19 21:40:52.810270              365
2 2024-09-19 21:41:05.541207              362
3 2024-09-19 21:41:18.975768              352
4 2024-09-19 21:41:32.663126              349
5 2024-09-19 21:41:45.445034              348
6 2024-09-19 21:41:59.344311              336
7 2024-09-19 21:42:14.034988              343
8 2024-09-19 21:42:27.428431              335
9 2024-09-19 21:42:40.979813              327
Results have been written to forecasted_parking_spots_time_based.csv

6. Data Drifting¶

Comments on the dataset for accuracy: 2 data set information, 5 minutes interval between the dataset, each belongs to the last 15 minutes data, (3 minute resampling is done)

to make an easy comparison, normalization is done

for Kolmogorov-Smirnov Test, A significant p-value would indicate that the distribution of the data in these 5-minute intervals has drifted from the original training data, suggesting that the data properties have changed.

Histograms and KDE Plots: Visualize and compare the distributions of the two datasets. Kernel Density Estimate(KDE):visualizing the Probability Density of a continuous variable.

Correlation Matrix Heatmaps: Compare the correlation patterns to detect any structural changes in the data.

Resample data

Time Occupied 2024-09-03 10:00:00 1 2024-09-03 10:01:00 0 2024-09-03 10:02:00 1 2024-09-03 10:03:00 1 2024-09-03 10:04:00 0 2024-09-03 10:05:00 1 ... Resampling to 3-Minute Intervals:

When you resample this data to 3 minute intervals, the data will be grouped into blocks of 3 minutes

Resampled Time Occupied (Count) 2024-09-03 10:00:00 3 (Count of "1"s from 10:00:00 to 10:02:59) 2024-09-03 10:03:00 2 (Count of "1"s from 10:03:00 to 10:05:59) ... The Reason I do Resampling the dataset in 3 minute blocks. Reduce noise with decreasing rapid fluctuations. To identify broader patterns over slightly longer periods. Reduce the volume of data points, make it easier to manage and analyze for longer periods.

Normalization in the code

Example: In the parking data set, the kerbsideid counts can change a lot and frequently, so some 3-minute intervals having very high counts and others having low counts. Normalizing these counts guuarantee that the range of values is consistent across all intervals.

So, Normalization all the data points are on a similar scale, typically between 0 and 1.


Interpratation of the Graph - KDE PLOT GRAPH - KERNEL DENSITY ESTIMATE


*The peaks in the KDE plot shows the most frequent values in the dataset. If the peaks for the two datasets (first 15 minutes and the next 15 minutes) are located at the same place, it shows that the most common values are similar in both datasets. "So the peaks are similar"


*Height of Peaks: The height of the peaks indicates the density of data points around that value. Higher peaks means that many data points are clustered around that value, showing a strong preference in the data at that specific value.


*Width of the Distribution Narrow or Wide: If one dataset has a much wider distribution than the other, this shows that the values in that dataset are more varied.


Overlap Between Distributions: Significant Overlap: If the KDE plots for the two datasets overlap significantly, it indicates that the distributions are quite similar. This would suggest minimal data drift between the two time periods. Little or No Overlap: If there is little overlap between the KDE plots, this suggests a significant difference in the distributions, which may indicate data drift.


Tails of the Distribution Symmetry: If the KDE plot is symmetric, it suggests that the data is evenly distributed around the mean. Symmetry in both plots indicates that both datasets have similar central tendencies. Skewness: If one KDE plot is skewed to the left or right , it shows that the data is not evenly distributed. A change in skewness between the two datasets may suggest a shift in the underlying data distribution.

In [13]:
import pandas as pd
import pytz
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler
from scipy.stats import ks_2samp
import time

# Function to fetch and process the dataset
def fetch_and_process_data():
    # API details
    base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
    dataset_id = 'on-street-parking-bay-sensors'

    # Fetch the dataset from the API
    url = f"{base_url}{dataset_id}/exports/csv"
    df = pd.read_csv(url, delimiter=';')

    # Define the timezone conversion function
    def convert_utc_to_melbourne(utc_time_str):
        melbourne_zone = pytz.timezone('Australia/Melbourne')
        utc_time = pd.to_datetime(utc_time_str, utc=True)
        melbourne_time = utc_time.tz_convert(melbourne_zone)
        return melbourne_time

    # Convert the specified columns
    columns_to_convert = ['lastupdated', 'status_timestamp']
    for column in columns_to_convert:
        if column in df.columns:
            df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)

    # Define the interval to capture data (last 15 minutes)
    fifteen_minutes_ago = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(minutes=15)
    df_filtered = df[df['status_timestamp'] >= fifteen_minutes_ago]

    # Resample data to a 3-minute frequency
    df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({
        'kerbsideid': 'count'
    })

    # Normalize the data
    scaler = MinMaxScaler(feature_range=(0, 1))
    df_resampled_scaled = scaler.fit_transform(df_resampled)

    return df_resampled_scaled

# Capture the first dataset now
df_first_resampled_scaled = fetch_and_process_data()

# Save the first dataset to a CSV file for comparison
output_file_first = 'first_dataset.csv'
pd.DataFrame(df_first_resampled_scaled, columns=['kerbsideid']).to_csv(output_file_first, index=False)
print(f"First dataset has been saved to {output_file_first}")

# Wait for 5 minutes
time.sleep(300)  # Sleep for 300 seconds (5 minutes)

# Capture the second dataset after 5 minutes
df_second_resampled_scaled = fetch_and_process_data()

# Save the second dataset to a CSV file for comparison
output_file_second = 'second_dataset.csv'
pd.DataFrame(df_second_resampled_scaled, columns=['kerbsideid']).to_csv(output_file_second, index=False)
print(f"Second dataset has been saved to {output_file_second}")

# Load the first and second datasets
df_first_resampled_scaled = pd.read_csv('first_dataset.csv')
df_second_resampled_scaled = pd.read_csv('second_dataset.csv')

# Statistical test for data drift: Kolmogorov-Smirnov test
ks_stat, ks_p_value = ks_2samp(df_first_resampled_scaled['kerbsideid'], df_second_resampled_scaled['kerbsideid'])
print(f'Kolmogorov-Smirnov Test Statistic: {ks_stat:.4f}, p-value: {ks_p_value:.4f}')

# Visualization of data drift

# Histograms to compare distributions
plt.figure(figsize=(12, 6))
plt.hist(df_first_resampled_scaled['kerbsideid'], bins=10, alpha=0.5, label='First Dataset')
plt.hist(df_second_resampled_scaled['kerbsideid'], bins=10, alpha=0.5, label='Second Dataset')
plt.title('Comparison of Two 15-Minute Intervals (3-Minute Resampling)')
plt.xlabel('Scaled Values')
plt.ylabel('Frequency')
plt.legend()
plt.show()

# KDE plots to compare distributions
plt.figure(figsize=(12, 6))
sns.kdeplot(df_first_resampled_scaled['kerbsideid'], label='First Dataset', shade=True)
sns.kdeplot(df_second_resampled_scaled['kerbsideid'], label='Second Dataset', shade=True)
plt.title('KDE Plot Comparison of Two 15-Minute Intervals (3-Minute Resampling)')
plt.xlabel('Scaled Values')
plt.ylabel('Density')
plt.legend()
plt.show()

# Heatmap to check for data drift in correlation
sns.heatmap(df_first_resampled_scaled.corr(), annot=True, cmap='coolwarm', center=0)
plt.title('Correlation Matrix for First Dataset (3-Minute Resampling)')
plt.show()

sns.heatmap(df_second_resampled_scaled.corr(), annot=True, cmap='coolwarm', center=0)
plt.title('Correlation Matrix for Second Dataset (3-Minute Resampling)')
plt.show()
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\669892709.py:38: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({
First dataset has been saved to first_dataset.csv
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\669892709.py:38: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({
Second dataset has been saved to second_dataset.csv
Kolmogorov-Smirnov Test Statistic: 0.5500, p-value: 0.4286
No description has been provided for this image
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\669892709.py:89: FutureWarning: 

`shade` is now deprecated in favor of `fill`; setting `fill=True`.
This will become an error in seaborn v0.14.0; please update your code.

  sns.kdeplot(df_first_resampled_scaled['kerbsideid'], label='First Dataset', shade=True)
C:\Users\ssgul\AppData\Local\Temp\ipykernel_23084\669892709.py:90: FutureWarning: 

`shade` is now deprecated in favor of `fill`; setting `fill=True`.
This will become an error in seaborn v0.14.0; please update your code.

  sns.kdeplot(df_second_resampled_scaled['kerbsideid'], label='Second Dataset', shade=True)
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

7. Quantitative Measuring for Data Drift: 3 ways to measure¶


Kolmogorov-Smirnov Test:

**Statistic (ks_stat): Indicates the maximum difference between the cumulative distributions of the two datasets. A higher value indicates more significant drift. ***p-value (ks_p_value): Helps determine whether the observed drift is statistically significant. A low p-value (typically < 0.05) suggests significant drift.

Measure Result in the previous code: Kolmogorov-Smirnov Test Statistic: 0.3500, p-value: 0.8730


Other Data Drift Measuring Techniques

Earth Mover's Distance (EMD):

EMD: Represents the minimum "work" needed to transform one distribution into another. Higher values indicate that the distributions are more different, suggesting greater drift.


Jensen-Shannon Divergence (JSD):

JSD: Measures the divergence between the two distributions. The result ranges from 0 (no divergence) to 1 (complete divergence). A higher JSD indicates more drift.


7.1. Measuring and Comparing the Data drift calculations between 2 recent data sets. (15 minutes- time difference)¶

In [20]:
import pandas as pd
import pytz
from datetime import timedelta
from sklearn.preprocessing import MinMaxScaler
from scipy.stats import ks_2samp, wasserstein_distance
from scipy.spatial.distance import jensenshannon
import time

# Function to fetch and process the dataset
def fetch_and_process_data():
    base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
    dataset_id = 'on-street-parking-bay-sensors'
    url = f"{base_url}{dataset_id}/exports/csv"
    df = pd.read_csv(url, delimiter=';')

    def convert_utc_to_melbourne(utc_time_str):
        melbourne_zone = pytz.timezone('Australia/Melbourne')
        utc_time = pd.to_datetime(utc_time_str, utc=True)
        melbourne_time = utc_time.tz_convert(melbourne_zone)
        return melbourne_time

    columns_to_convert = ['lastupdated', 'status_timestamp']
    for column in columns_to_convert:
        if column in df.columns:
            df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)

    fifteen_minutes_ago = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(minutes=15)
    df_filtered = df[df['status_timestamp'] >= fifteen_minutes_ago]

    df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({
        'kerbsideid': 'count'
    })

    scaler = MinMaxScaler(feature_range=(0, 1))
    df_resampled_scaled = scaler.fit_transform(df_resampled)

    return df_resampled_scaled

# Capture datasets for comparison
df_first_resampled_scaled = fetch_and_process_data()
output_file_first = 'first_dataset.csv'
pd.DataFrame(df_first_resampled_scaled, columns=['kerbsideid']).to_csv(output_file_first, index=False)

time.sleep(300)  # Sleep for 5 minutes

df_second_resampled_scaled = fetch_and_process_data()
output_file_second = 'second_dataset.csv'
pd.DataFrame(df_second_resampled_scaled, columns=['kerbsideid']).to_csv(output_file_second, index=False)

# Load datasets
df_first_resampled_scaled = pd.read_csv('first_dataset.csv')
df_second_resampled_scaled = pd.read_csv('second_dataset.csv')

# Kolmogorov-Smirnov Test
ks_stat, ks_p_value = ks_2samp(df_first_resampled_scaled['kerbsideid'], df_second_resampled_scaled['kerbsideid'])

# Earth Mover's Distance (EMD)
emd = wasserstein_distance(df_first_resampled_scaled['kerbsideid'], df_second_resampled_scaled['kerbsideid'])

# Jensen-Shannon Divergence (JSD)
jsd = jensenshannon(df_first_resampled_scaled['kerbsideid'], df_second_resampled_scaled['kerbsideid'], base=2)

# Create a comparison table
comparison_data = {
    "Metrics": ["Kolmogorov-Smirnov Statistic", "Kolmogorov-Smirnov p-value", "Earth Mover's Distance (EMD)", "Jensen-Shannon Divergence (JSD)"],
    "Values": [ks_stat, ks_p_value, emd, jsd]
}

comparison_df = pd.DataFrame(comparison_data)

# Print the comparison table
print("\nComparison Table:")
print(comparison_df)
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\2493708620.py:30: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({
Comparison Table:
                           Metrics    Values
0     Kolmogorov-Smirnov Statistic  0.400000
1       Kolmogorov-Smirnov p-value  0.873016
2     Earth Mover's Distance (EMD)  0.049623
3  Jensen-Shannon Divergence (JSD)  0.041328
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\2493708620.py:30: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({

7.1.1. Interpretation of the above results¶

the p-value in Kolmogorov-Smirmnov method, Test is specific to the Kolmogorov-Smirnov (KS) test. It is a test of the model that two samples came from similar distributions. It also helps to determine whether the observed differences between the distributions are statistically significant using the p-values:

A low p-value (< 0.05) tells that the distributions are significantly different. A high p-value (>= 0.05) tells there is no significant difference between the distributions.

The Earth Mover's Distance (EMD) & Jensen-Shannon Divergence (JSD) are the other measuring models of the dissimilarity between two distributions. They do not have a p-value. They are directly measure the "difference" or "cost" of transforming one distribution into the other.

Detailed comments of the Results

Kolmogorov-Smirnov (KS) Statistic: 0.6000, p-value: 0.3571 The KS statistic indicates some level of difference between the two distributions. In addition to this, the p-value is bigger than 0.05, it tells that the difference is not statistically significant. This means that there is no strong evidence of data drift based on the KS test.

Earth Mover's Distance (EMD): 0.2218 In simple terms, the EMD measures how costly it is to change a distribution into some other form. Low values are an indicator for similar distributions. This dissimilarity however may not be large since the EMD equals 0.2218 indicating moderate magnitude of discrepancies between them without necessarily implying significant drift in data.

Jensen-Shannon Divergence (JSD): 0.2292 JSD is a value which is used to measure the difference between two probability distributions. Low JSD values show that the probability distributions have high likeness, but if it is near to one, then the two are significantly divergent. The JSD value used in this context is fairly low implying that they are approximately equal in the sense of reasonable similarity and no marked difference in data shift detected.

Conclusion: Based on the Kolmogorov-Smirnov EMD, and JSD results: There have been no extensive signs of significant data shifts between these datasets throughout the periods. Despite small variations within their distributions which differentiate them from each other,As such, one would say that the parking bay sensor data has remained quite constant across both trials.

Medium-Term Prediction (Next Day to Week): Aggregate the data to an hourly interval.

If we think about the Medium-term predictions: such as Long Short-Term Memory (LSTM) and spatio-temporal models, These methods use historical parking data combined with external factors like weather or traffic conditions. Studies indicate that medium-term forecasts of up to 2 to 3 hours are usually very realistic, particular to commercial regions.​

Melbourne Municipality's Needs: For Melbourne municipality, real-time parking prediction and medium-term forecasting are very vital for managing urban mobility effectively. The city’s Transport Strategy 2030 tells reducing congestion and enhancing parking management as the important goals. The City of Melbourne has also declared that the need for data-driven solutions for parking allocation.

LSTM Model: This model is used for the Prediction

In [21]:
import pandas as pd
import pytz
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from scipy.stats import ks_2samp, wasserstein_distance
from scipy.spatial.distance import jensenshannon
from datetime import timedelta

# Function to fetch and process the dataset
def fetch_and_process_data():
    base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
    dataset_id = 'on-street-parking-bay-sensors'
    url = f"{base_url}{dataset_id}/exports/csv"
    df = pd.read_csv(url, delimiter=';')

    def convert_utc_to_melbourne(utc_time_str):
        melbourne_zone = pytz.timezone('Australia/Melbourne')
        utc_time = pd.to_datetime(utc_time_str, utc=True)
        melbourne_time = utc_time.tz_convert(melbourne_zone)
        return melbourne_time

    columns_to_convert = ['lastupdated', 'status_timestamp']
    for column in columns_to_convert:
        if column in df.columns:
            df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)

    two_hours_ago = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(hours=2)
    df_filtered = df[df['status_timestamp'] >= two_hours_ago]

    df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({
        'kerbsideid': 'count'
    }).fillna(0)

    scaler = MinMaxScaler(feature_range=(0, 1))
    df_resampled_scaled = scaler.fit_transform(df_resampled)

    return df_resampled_scaled, scaler

# Split data into features (X) and targets (Y) with look-back window
def split_data(df_resampled_scaled, time_steps=20):  # Reduced time_steps to 20
    X, y = [], []
    for i in range(len(df_resampled_scaled) - time_steps - 1):
        X.append(df_resampled_scaled[i:(i + time_steps), 0])  # Collecting the last 'time_steps' observations
        y.append(df_resampled_scaled[i + time_steps, 0])  # The target is the next observation
    return np.array(X), np.array(y)

# LSTM model creation
def build_lstm_model(time_steps=20):  # Updated to match the new time_steps
    model = Sequential()
    model.add(LSTM(50, return_sequences=False, input_shape=(time_steps, 1)))
    model.add(Dense(1))
    model.compile(optimizer='adam', loss='mse')
    return model

# LSTM Forecast function
def lstm_forecast(df_resampled_scaled, scaler, time_steps=20):
    X, y = split_data(df_resampled_scaled, time_steps)
    
    # Check if we have enough data points
    if len(X) == 0:
        raise ValueError(f"Not enough data points for the given time_steps ({time_steps}). Try reducing the time_steps.")
    
    print(f"Number of available data points: {len(X)}")
    
    X = np.reshape(X, (X.shape[0], X.shape[1], 1))  # Reshaping into [samples, time_steps, features]

    # Splitting the data into training and testing sets
    split_index = int(len(X) * 0.8)
    X_train, X_test = X[:split_index], X[split_index:]
    y_train, y_test = y[:split_index], y[split_index:]

    # Build and train LSTM model
    lstm_model = build_lstm_model(time_steps)
    lstm_model.fit(X_train, y_train, epochs=5, batch_size=32, verbose=2)

    # Generate predictions on the test data
    lstm_predictions = lstm_model.predict(X_test)
    
    # Inverse transform the predictions and actual values
    lstm_predictions_inverse = scaler.inverse_transform(lstm_predictions)
    y_test_inverse = scaler.inverse_transform(y_test.reshape(-1, 1))

    return lstm_predictions_inverse, y_test_inverse

# Execute LSTM model
df_resampled_scaled, scaler = fetch_and_process_data()
lstm_predictions, y_test_actual = lstm_forecast(df_resampled_scaled, scaler, time_steps=20)

# Kolmogorov-Smirnov Test
ks_stat_lstm, ks_p_value_lstm = ks_2samp(lstm_predictions.flatten(), y_test_actual.flatten())

# Earth Mover's Distance (EMD)
emd_lstm = wasserstein_distance(lstm_predictions.flatten(), y_test_actual.flatten())

# Jensen-Shannon Divergence (JSD)
jsd_lstm = jensenshannon(lstm_predictions.flatten(), y_test_actual.flatten())

# Print Results for LSTM
print(f"LSTM Model:")
print(f"Kolmogorov-Smirnov Statistic: {ks_stat_lstm:.4f}, p-value: {ks_p_value_lstm:.4f}")
print(f"Earth Mover's Distance (EMD): {emd_lstm:.4f}")
print(f"Jensen-Shannon Divergence (JSD): {jsd_lstm:.4f}")
Number of available data points: 19
Epoch 1/5
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\3311060564.py:33: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\keras\src\layers\rnn\rnn.py:204: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
1/1 - 3s - 3s/step - loss: 0.3212
Epoch 2/5
1/1 - 0s - 58ms/step - loss: 0.2924
Epoch 3/5
1/1 - 0s - 55ms/step - loss: 0.2651
Epoch 4/5
1/1 - 0s - 63ms/step - loss: 0.2391
Epoch 5/5
1/1 - 0s - 56ms/step - loss: 0.2142
WARNING:tensorflow:5 out of the last 11 calls to <function TensorFlowTrainer.make_predict_function.<locals>.one_step_on_data_distributed at 0x00000145F50A5580> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has reduce_retracing=True option that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 319ms/step
LSTM Model:
Kolmogorov-Smirnov Statistic: 1.0000, p-value: 0.0286
Earth Mover's Distance (EMD): 74.7393
Jensen-Shannon Divergence (JSD): 0.0379

7.2.Plot the predicted available spots melbourne city map¶

In [28]:
import pandas as pd
import pytz
import numpy as np
import geopandas as gpd
import matplotlib.pyplot as plt
import contextily as ctx
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from scipy.stats import ks_2samp, wasserstein_distance
from scipy.spatial.distance import jensenshannon
from datetime import timedelta

# Function to fetch and process the dataset for a specific time window
def fetch_and_process_data(hours_ago):
    base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
    dataset_id = 'on-street-parking-bay-sensors'
    url = f"{base_url}{dataset_id}/exports/csv"
    df = pd.read_csv(url, delimiter=';')

    def convert_utc_to_melbourne(utc_time_str):
        melbourne_zone = pytz.timezone('Australia/Melbourne')
        utc_time = pd.to_datetime(utc_time_str, utc=True)
        melbourne_time = utc_time.tz_convert(melbourne_zone)
        return melbourne_time

    columns_to_convert = ['lastupdated', 'status_timestamp']
    for column in columns_to_convert:
        if column in df.columns:
            df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)

    # Get data within the window of 2 hours ago and an additional 2 hours before that
    end_time = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(hours=hours_ago)
    start_time = end_time - timedelta(hours=2)
    df_filtered = df[(df['status_timestamp'] >= start_time) & (df['status_timestamp'] < end_time)]

    df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({
        'kerbsideid': 'count'
    }).fillna(0)

    scaler = MinMaxScaler(feature_range=(0, 1))
    df_resampled_scaled = scaler.fit_transform(df_resampled)

    return df_filtered, df_resampled_scaled, scaler

# Split data into features (X) and targets (Y) with look-back window
def split_data(df_resampled_scaled, time_steps=30):  # Reduced time_steps to 30 for more flexibility
    X, y = [], []
    for i in range(len(df_resampled_scaled) - time_steps - 1):
        X.append(df_resampled_scaled[i:(i + time_steps), 0])  # Collecting the last 'time_steps' observations
        y.append(df_resampled_scaled[i + time_steps, 0])  # The target is the next observation
    return np.array(X), np.array(y)

# LSTM model creation for 2-hour forecast
def build_lstm_model(time_steps=30):  # Updated to match the new time_steps
    model = Sequential()
    model.add(LSTM(50, return_sequences=False, input_shape=(time_steps, 1)))
    model.add(Dense(1))
    model.compile(optimizer='adam', loss='mse')
    return model

# LSTM Forecast function
def lstm_forecast(df_resampled_scaled, scaler, time_steps=30):  # Reduced time_steps
    X, y = split_data(df_resampled_scaled, time_steps)
    
    # Check if we have enough data points
    if len(X) == 0:
        raise ValueError(f"Not enough data points for the given time_steps ({time_steps}). Try reducing the time_steps.")
    
    print(f"Number of available data points: {len(X)}")
    
    X = np.reshape(X, (X.shape[0], X.shape[1], 1))  # Reshaping into [samples, time_steps, features]

    # Splitting the data into training and testing sets
    split_index = int(len(X) * 0.8)
    X_train, X_test = X[:split_index], X[split_index:]
    y_train, y_test = y[:split_index], y[split_index:]

    # Build and train LSTM model
    lstm_model = build_lstm_model(time_steps)
    lstm_model.fit(X_train, y_train, epochs=5, batch_size=32, verbose=2)

    # Generate predictions on the test data
    lstm_predictions = lstm_model.predict(X_test)
    
    # Inverse transform the predictions and actual values
    lstm_predictions_inverse = scaler.inverse_transform(lstm_predictions)
    y_test_inverse = scaler.inverse_transform(y_test.reshape(-1, 1))

    return lstm_predictions_inverse, y_test_inverse

# Plot available spots on the map
def plot_available_spots(df, lstm_predictions):
    total_kerbside_ids = df['kerbsideid'].nunique()  # Total unique kerbside IDs
    forecast_occupied = lstm_predictions[-1][0]  # The forecasted occupied spots
    forecast_available = total_kerbside_ids - forecast_occupied  # Calculate available spots

    # Check if the location column has valid data
    if 'location' not in df.columns or df['location'].isnull().all():
        print("Error: No valid location data available for plotting.")
        return

    # Handle missing or malformed data in the location field
    df_available = df.dropna(subset=['location'])  # Drop rows where location is missing
    df_available['location'] = df_available['location'].astype(str)  # Ensure location is treated as a string

    # Directly split location into latitude and longitude without extra validation
    available_kerbside_ids = df_available[['kerbsideid', 'location']].drop_duplicates()
    location_split = available_kerbside_ids['location'].str.split(',', expand=True)

    if location_split.shape[1] != 2:
        print("Error: Location data is not split into two columns (latitude, longitude).")
        print(location_split.head())
        return

    available_kerbside_ids['Latitude'] = location_split[0].astype(float)
    available_kerbside_ids['Longitude'] = location_split[1].astype(float)

    # Plot available spots on a map
    gdf = gpd.GeoDataFrame(available_kerbside_ids, geometry=gpd.points_from_xy(available_kerbside_ids.Longitude, available_kerbside_ids.Latitude))
    gdf = gdf.set_crs(epsg=4326)

    ax = gdf.plot(figsize=(10, 10), color='blue', markersize=5)
    ctx.add_basemap(ax, crs=gdf.crs, source=ctx.providers.CartoDB.Positron)

    plt.title(f"Available Parking Spots in Melbourne (Predicted Available: {round(forecast_available)})")
    plt.xlabel("Longitude")
    plt.ylabel("Latitude")
    plt.show()

# Execute LSTM model
df, df_resampled_scaled, scaler = fetch_and_process_data(hours_ago=2)
lstm_predictions, y_test_actual = lstm_forecast(df_resampled_scaled, scaler, time_steps=30)  # Reduced time_steps to 30

# Kolmogorov-Smirnov Test
ks_stat_lstm, ks_p_value_lstm = ks_2samp(lstm_predictions.flatten(), y_test_actual.flatten())

# Earth Mover's Distance (EMD)
emd_lstm = wasserstein_distance(lstm_predictions.flatten(), y_test_actual.flatten())

# Jensen-Shannon Divergence (JSD)
jsd_lstm = jensenshannon(lstm_predictions.flatten(), y_test_actual.flatten())

# Print Results for LSTM
print(f"LSTM Model:")
print(f"Kolmogorov-Smirnov Statistic: {ks_stat_lstm:.4f}, p-value: {ks_p_value_lstm:.4f}")
print(f"Earth Mover's Distance (EMD): {emd_lstm:.4f}")
print(f"Jensen-Shannon Divergence (JSD): {jsd_lstm:.4f}")

# Plot the future available spots
plot_available_spots(df, lstm_predictions)
Number of available data points: 10
Epoch 1/5
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\4288111614.py:38: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\keras\src\layers\rnn\rnn.py:204: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
1/1 - 2s - 2s/step - loss: 0.3544
Epoch 2/5
1/1 - 0s - 60ms/step - loss: 0.3187
Epoch 3/5
1/1 - 0s - 62ms/step - loss: 0.2847
Epoch 4/5
1/1 - 0s - 60ms/step - loss: 0.2523
Epoch 5/5
1/1 - 0s - 58ms/step - loss: 0.2215
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 304ms/step
LSTM Model:
Kolmogorov-Smirnov Statistic: 1.0000, p-value: 0.3333
Earth Mover's Distance (EMD): 10.9529
Jensen-Shannon Divergence (JSD): 0.0643
No description has been provided for this image

8. Medium Term Prediction - Spatio-temporal models - Convolutional LSTM (ConvLSTM)¶

In [29]:
import pandas as pd
import pytz
import numpy as np
import geopandas as gpd
import matplotlib.pyplot as plt
import contextily as ctx
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import ConvLSTM2D, Dense, Flatten
from scipy.stats import ks_2samp, wasserstein_distance
from scipy.spatial.distance import jensenshannon
from datetime import timedelta

# Function to fetch and process the dataset for a specific time window
def fetch_and_process_data(hours_ago):
    base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
    dataset_id = 'on-street-parking-bay-sensors'
    url = f"{base_url}{dataset_id}/exports/csv"
    df = pd.read_csv(url, delimiter=';')

    def convert_utc_to_melbourne(utc_time_str):
        melbourne_zone = pytz.timezone('Australia/Melbourne')
        utc_time = pd.to_datetime(utc_time_str, utc=True)
        melbourne_time = utc_time.tz_convert(melbourne_zone)
        return melbourne_time

    columns_to_convert = ['lastupdated', 'status_timestamp']
    for column in columns_to_convert:
        if column in df.columns:
            df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)

    # Get data within the window of 2 hours ago and an additional 2 hours before that
    end_time = pd.Timestamp.now(pytz.timezone('Australia/Melbourne')) - timedelta(hours=hours_ago)
    start_time = end_time - timedelta(hours=2)
    df_filtered = df[(df['status_timestamp'] >= start_time) & (df['status_timestamp'] < end_time)]

    df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({
        'kerbsideid': 'count'
    }).fillna(0)

    scaler = MinMaxScaler(feature_range=(0, 1))
    df_resampled_scaled = scaler.fit_transform(df_resampled)

    return df_filtered, df_resampled_scaled, scaler

# Split data into features (X) and targets (Y) with look-back window for spatio-temporal data
def split_spatio_temporal_data(df_resampled_scaled, time_steps=30, height=1, width=1):
    X, y = [], []
    for i in range(len(df_resampled_scaled) - time_steps - 1):
        X.append(df_resampled_scaled[i:(i + time_steps), 0].reshape(time_steps, height, width, 1))  # Spatio-temporal reshaping
        y.append(df_resampled_scaled[i + time_steps, 0])
    return np.array(X), np.array(y)

# ConvLSTM model creation for spatio-temporal data
def build_conv_lstm_model(time_steps=30, height=1, width=1):
    model = Sequential()
    model.add(ConvLSTM2D(filters=64, kernel_size=(1, 1), input_shape=(time_steps, height, width, 1), return_sequences=False))
    model.add(Flatten())
    model.add(Dense(1))  # Single output for regression
    model.compile(optimizer='adam', loss='mse')
    return model

# ConvLSTM Forecast function
def conv_lstm_forecast(df_resampled_scaled, scaler, time_steps=30, height=1, width=1):
    X, y = split_spatio_temporal_data(df_resampled_scaled, time_steps, height, width)
    
    # Check if we have enough data points
    if len(X) == 0:
        raise ValueError(f"Not enough data points for the given time_steps ({time_steps}). Try reducing the time_steps.")
    
    print(f"Number of available data points: {len(X)}")
    
    # Splitting the data into training and testing sets
    split_index = int(len(X) * 0.8)
    X_train, X_test = X[:split_index], X[split_index:]
    y_train, y_test = y[:split_index], y[split_index:]

    # Build and train ConvLSTM model
    conv_lstm_model = build_conv_lstm_model(time_steps, height, width)
    conv_lstm_model.fit(X_train, y_train, epochs=5, batch_size=32, verbose=2)

    # Generate predictions on the test data
    conv_lstm_predictions = conv_lstm_model.predict(X_test)
    
    # Inverse transform the predictions and actual values
    conv_lstm_predictions_inverse = scaler.inverse_transform(conv_lstm_predictions)
    y_test_inverse = scaler.inverse_transform(y_test.reshape(-1, 1))

    return conv_lstm_predictions_inverse, y_test_inverse

# Plot available spots on the map
def plot_available_spots(df, lstm_predictions):
    total_kerbside_ids = df['kerbsideid'].nunique()  # Total unique kerbside IDs
    forecast_occupied = lstm_predictions[-1][0]  # The forecasted occupied spots
    forecast_available = total_kerbside_ids - forecast_occupied  # Calculate available spots

    # Check if the location column has valid data
    if 'location' not in df.columns or df['location'].isnull().all():
        print("Error: No valid location data available for plotting.")
        return

    # Handle missing or malformed data in the location field
    df_available = df.dropna(subset=['location'])  # Drop rows where location is missing
    df_available['location'] = df_available['location'].astype(str)  # Ensure location is treated as a string

    # Directly split location into latitude and longitude without extra validation
    available_kerbside_ids = df_available[['kerbsideid', 'location']].drop_duplicates()
    location_split = available_kerbside_ids['location'].str.split(',', expand=True)

    if location_split.shape[1] != 2:
        print("Error: Location data is not split into two columns (latitude, longitude).")
        print(location_split.head())
        return

    available_kerbside_ids['Latitude'] = location_split[0].astype(float)
    available_kerbside_ids['Longitude'] = location_split[1].astype(float)

    # Plot available spots on a map
    gdf = gpd.GeoDataFrame(available_kerbside_ids, geometry=gpd.points_from_xy(available_kerbside_ids.Longitude, available_kerbside_ids.Latitude))
    gdf = gdf.set_crs(epsg=4326)

    ax = gdf.plot(figsize=(10, 10), color='blue', markersize=5)
    ctx.add_basemap(ax, crs=gdf.crs, source=ctx.providers.CartoDB.Positron)

    plt.title(f"Available Parking Spots in Melbourne (Predicted Available: {round(forecast_available)})")
    plt.xlabel("Longitude")
    plt.ylabel("Latitude")
    plt.show()

# Execute ConvLSTM model (spatio-temporal)
df, df_resampled_scaled, scaler = fetch_and_process_data(hours_ago=2)
conv_lstm_predictions, y_test_actual = conv_lstm_forecast(df_resampled_scaled, scaler, time_steps=30)

# Kolmogorov-Smirnov Test
ks_stat_conv_lstm, ks_p_value_conv_lstm = ks_2samp(conv_lstm_predictions.flatten(), y_test_actual.flatten())

# Earth Mover's Distance (EMD)
emd_conv_lstm = wasserstein_distance(conv_lstm_predictions.flatten(), y_test_actual.flatten())

# Jensen-Shannon Divergence (JSD)
jsd_conv_lstm = jensenshannon(conv_lstm_predictions.flatten(), y_test_actual.flatten())

# Print Results for ConvLSTM
print(f"ConvLSTM Model:")
print(f"Kolmogorov-Smirnov Statistic: {ks_stat_conv_lstm:.4f}, p-value: {ks_p_value_conv_lstm:.4f}")
print(f"Earth Mover's Distance (EMD): {emd_conv_lstm:.4f}")
print(f"Jensen-Shannon Divergence (JSD): {jsd_conv_lstm:.4f}")

# Plot the future available spots
plot_available_spots(df, conv_lstm_predictions)
Number of available data points: 10
Epoch 1/5
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\1704495320.py:38: FutureWarning: 'T' is deprecated and will be removed in a future version, please use 'min' instead.
  df_resampled = df_filtered.resample('3T', on='status_timestamp').agg({
c:\Users\ssgul\AppData\Local\Programs\Python\Python312\Lib\site-packages\keras\src\layers\rnn\rnn.py:204: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
  super().__init__(**kwargs)
1/1 - 3s - 3s/step - loss: 0.5124
Epoch 2/5
1/1 - 0s - 99ms/step - loss: 0.4596
Epoch 3/5
1/1 - 0s - 96ms/step - loss: 0.4091
Epoch 4/5
1/1 - 0s - 93ms/step - loss: 0.3609
Epoch 5/5
1/1 - 0s - 94ms/step - loss: 0.3148
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 397ms/step
ConvLSTM Model:
Kolmogorov-Smirnov Statistic: 1.0000, p-value: 0.3333
Earth Mover's Distance (EMD): 13.0683
Jensen-Shannon Divergence (JSD): 0.0573
No description has been provided for this image

9. Interpretation - Based on the results for Data Drift monitoring¶

Kolmogorov-Smirnov Statistic and p-value: Both models have a Kolmogorov-Smirnov Statistic of 1.0000 with a p-value of 0.3333.

This means that both models show a significant difference between the predicted and actual distributions. Although there looks like a significant difference between the predicted and actual distribution, the p-value is above 0.05, so this means we should consider the both distrution similar with a high confidence level.

Earth Mover's Distance (EMD)

ConvLSTM EMD: 13.5017 LSTM EMD: 10.4545

The Earth Mover's Distance (EMD) measures the minimum "effort" required to transform one distribution into another. A smaller EMD value indicates that the predicted values are closer to the actual values.

The LSTM model has a lower EMD (10.4545), meaning its predictions are closer to the actual values compared to the ConvLSTM model, which has a higher EMD (13.5017). This suggests that LSTM performs better in terms of minimizing the difference between predicted and actual values over time.

Jensen-Shannon Divergence (JSD)

ConvLSTM JSD: 0.0059 LSTM JSD: 0.0037 The Jensen-Shannon Divergence (JSD) measures how similar two probability distributions are, with lower values indicating more similarity.

LSTM again has a lower JSD (0.0037), indicating that it produces predictions whose probability distribution is closer to the actual data compared to ConvLSTM (0.0059).

For this reason, LSTM looks better in terms of the similarity between the predicted and actual probability distributions.

So, As a result, LSTM shows better performance when using in medium term prediction algorithms in terms of data drifting.

10. Long Term Prediction¶

NEXT 1 YEAR FORECASTING - The code also will do the Data Drift calculations for comparison. Kolmogorov-Smirnov Statistic ,Earth Mover's Distance (EMD), Jensen-Shannon Divergence (JSD)

1-Random Forest Regressor Model

In [30]:
import pandas as pd
import pytz
from datetime import timedelta
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import MinMaxScaler
from scipy.stats import ks_2samp, wasserstein_distance
from scipy.spatial.distance import jensenshannon
import matplotlib.pyplot as plt

# Fetch and process the data for the last 6 months
def fetch_and_process_data(months_ago):
    base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
    dataset_id = 'on-street-parking-bay-sensors'
    url = f"{base_url}{dataset_id}/exports/csv"
    df = pd.read_csv(url, delimiter=';')

    def convert_utc_to_melbourne(utc_time_str):
        melbourne_zone = pytz.timezone('Australia/Melbourne')
        utc_time = pd.to_datetime(utc_time_str, utc=True)
        melbourne_time = utc_time.tz_convert(melbourne_zone)
        return melbourne_time

    columns_to_convert = ['lastupdated', 'status_timestamp']
    for column in columns_to_convert:
        if column in df.columns:
            df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)

    # Get data for the last 6 months
    end_time = pd.Timestamp.now(pytz.timezone('Australia/Melbourne'))
    start_time = end_time - pd.DateOffset(months=months_ago)
    df_filtered = df[(df['status_timestamp'] >= start_time) & (df['status_timestamp'] < end_time)]

    if df_filtered.empty:
        raise ValueError("No data found for the specified time window.")

    df_resampled = df_filtered.resample('1D', on='status_timestamp').agg({
        'kerbsideid': 'count'
    }).fillna(0)

    if df_resampled.empty:
        raise ValueError("No resampled data found for the specified time window.")

    scaler = MinMaxScaler(feature_range=(0, 1))
    df_resampled_scaled = scaler.fit_transform(df_resampled)

    return df_filtered, df_resampled, df_resampled_scaled, scaler

# Use 6 months of data
try:
    df, df_resampled, df_resampled_scaled, scaler = fetch_and_process_data(months_ago=6)
except ValueError as e:
    print(f"Error: {e}")
    exit()

# Prepare the dataset for Random Forest
def create_lag_features(data, lag=1):
    df_lag = pd.DataFrame()
    df_lag['available_spots'] = data.flatten()
    for i in range(1, lag + 1):
        df_lag[f'lag_{i}'] = df_lag['available_spots'].shift(i)
    df_lag.dropna(inplace=True)
    return df_lag

lagged_data = create_lag_features(df_resampled_scaled, lag=30)  # Use 30-day lag for monthly forecasting
X = lagged_data.drop('available_spots', axis=1)
y = lagged_data['available_spots']

# Train the Random Forest model
rf_model = RandomForestRegressor(n_estimators=100)
rf_model.fit(X[:-1], y[:-1])

# Forecast for the next 6 months (predict multiple steps)
forecast_rf = []
current_input = X[-1:].copy()  # Start with the last available data point

for _ in range(6):  # Predict for the next 6 months
    next_forecast = rf_model.predict(current_input)
    forecast_rf.append(next_forecast[0])
    
    # Update the input with the new forecast (shift the window)
    current_input = current_input.shift(-1, axis=1)
    current_input.iloc[0, -1] = next_forecast  # Add the predicted value to the input

forecast_rf = scaler.inverse_transform(pd.DataFrame(forecast_rf))  # Inverse transform the forecasted values

# Data drift calculations (2 months apart data)
ks_stat_rf, ks_p_value_rf = ks_2samp(forecast_rf.flatten(), y.values[-6:])  # Compare forecast vs last 6 months
emd_rf = wasserstein_distance(forecast_rf.flatten(), y.values[-6:])
jsd_rf = jensenshannon(forecast_rf.flatten(), y.values[-6:])

# Print Results for Random Forest
print(f"Random Forest Model:")
print(f"Kolmogorov-Smirnov Statistic: {ks_stat_rf:.4f}, p-value: {ks_p_value_rf:.4f}")
print(f"Earth Mover's Distance (EMD): {emd_rf:.4f}")
print(f"Jensen-Shannon Divergence (JSD): {jsd_rf:.4f}")

# Plot the bar graph with x and y axis labels
plt.figure(figsize=(10, 6))
plt.plot(df_resampled.index, df_resampled_scaled, label='Historical Data')
plt.plot(pd.date_range(df_resampled.index[-1], periods=7, freq='ME')[1:], forecast_rf, label='Forecast (Random Forest)', color='red')
plt.title("6-Month Parking Availability Forecast (Random Forest)")
plt.xlabel("Date")  # X-axis label
plt.ylabel("Available Parking Spots (Normalized)")  # Y-axis label
plt.legend()
plt.show()

# List of 50 sample predicted parking spots, with kerbside IDs and date for availability
print("\nSample List of 50 Available Parking Spots (Predicted for Next 6 Months):")
kerbside_ids = ['KSID_' + str(i+1) for i in range(50)]  # Ensure we have enough kerbside IDs
forecast_dates = pd.date_range(df_resampled.index[-1], periods=7, freq='ME')[1:]  # Predicted dates

# Creating a sample list of 50 rows with kerbside ID, date, and available spots
sample_list = [{'KerbsideID': kerbside_ids[i], 
                'Date': forecast_dates[i % len(forecast_dates)].date(),  # Rotating through dates
                'AvailableSpots': round(forecast_rf.flatten()[i % len(forecast_rf.flatten())])}
               for i in range(50)]

# Display the first 50 rows
for sample in sample_list:
    print(f"Kerbside ID: {sample['KerbsideID']}, Date: {sample['Date']}, Available Spots: {sample['AvailableSpots']}")
Random Forest Model:
Kolmogorov-Smirnov Statistic: 1.0000, p-value: 0.0022
Earth Mover's Distance (EMD): 31.2534
Jensen-Shannon Divergence (JSD): 0.6712
No description has been provided for this image
Sample List of 50 Available Parking Spots (Predicted for Next 6 Months):
Kerbside ID: KSID_1, Date: 2024-10-31, Available Spots: 32
Kerbside ID: KSID_2, Date: 2024-11-30, Available Spots: 42
Kerbside ID: KSID_3, Date: 2024-12-31, Available Spots: 30
Kerbside ID: KSID_4, Date: 2025-01-31, Available Spots: 14
Kerbside ID: KSID_5, Date: 2025-02-28, Available Spots: 56
Kerbside ID: KSID_6, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_7, Date: 2024-10-31, Available Spots: 32
Kerbside ID: KSID_8, Date: 2024-11-30, Available Spots: 42
Kerbside ID: KSID_9, Date: 2024-12-31, Available Spots: 30
Kerbside ID: KSID_10, Date: 2025-01-31, Available Spots: 14
Kerbside ID: KSID_11, Date: 2025-02-28, Available Spots: 56
Kerbside ID: KSID_12, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_13, Date: 2024-10-31, Available Spots: 32
Kerbside ID: KSID_14, Date: 2024-11-30, Available Spots: 42
Kerbside ID: KSID_15, Date: 2024-12-31, Available Spots: 30
Kerbside ID: KSID_16, Date: 2025-01-31, Available Spots: 14
Kerbside ID: KSID_17, Date: 2025-02-28, Available Spots: 56
Kerbside ID: KSID_18, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_19, Date: 2024-10-31, Available Spots: 32
Kerbside ID: KSID_20, Date: 2024-11-30, Available Spots: 42
Kerbside ID: KSID_21, Date: 2024-12-31, Available Spots: 30
Kerbside ID: KSID_22, Date: 2025-01-31, Available Spots: 14
Kerbside ID: KSID_23, Date: 2025-02-28, Available Spots: 56
Kerbside ID: KSID_24, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_25, Date: 2024-10-31, Available Spots: 32
Kerbside ID: KSID_26, Date: 2024-11-30, Available Spots: 42
Kerbside ID: KSID_27, Date: 2024-12-31, Available Spots: 30
Kerbside ID: KSID_28, Date: 2025-01-31, Available Spots: 14
Kerbside ID: KSID_29, Date: 2025-02-28, Available Spots: 56
Kerbside ID: KSID_30, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_31, Date: 2024-10-31, Available Spots: 32
Kerbside ID: KSID_32, Date: 2024-11-30, Available Spots: 42
Kerbside ID: KSID_33, Date: 2024-12-31, Available Spots: 30
Kerbside ID: KSID_34, Date: 2025-01-31, Available Spots: 14
Kerbside ID: KSID_35, Date: 2025-02-28, Available Spots: 56
Kerbside ID: KSID_36, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_37, Date: 2024-10-31, Available Spots: 32
Kerbside ID: KSID_38, Date: 2024-11-30, Available Spots: 42
Kerbside ID: KSID_39, Date: 2024-12-31, Available Spots: 30
Kerbside ID: KSID_40, Date: 2025-01-31, Available Spots: 14
Kerbside ID: KSID_41, Date: 2025-02-28, Available Spots: 56
Kerbside ID: KSID_42, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_43, Date: 2024-10-31, Available Spots: 32
Kerbside ID: KSID_44, Date: 2024-11-30, Available Spots: 42
Kerbside ID: KSID_45, Date: 2024-12-31, Available Spots: 30
Kerbside ID: KSID_46, Date: 2025-01-31, Available Spots: 14
Kerbside ID: KSID_47, Date: 2025-02-28, Available Spots: 56
Kerbside ID: KSID_48, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_49, Date: 2024-10-31, Available Spots: 32
Kerbside ID: KSID_50, Date: 2024-11-30, Available Spots: 42

2-GradientBoostingRegressor Model

In [31]:
import pandas as pd
import pytz
from datetime import timedelta
from sklearn.ensemble import GradientBoostingRegressor  # New model
from sklearn.preprocessing import MinMaxScaler
from scipy.stats import ks_2samp, wasserstein_distance
from scipy.spatial.distance import jensenshannon
import matplotlib.pyplot as plt

# Fetch and process the data for the last 6 months
def fetch_and_process_data(months_ago):
    base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
    dataset_id = 'on-street-parking-bay-sensors'
    url = f"{base_url}{dataset_id}/exports/csv"
    df = pd.read_csv(url, delimiter=';')

    def convert_utc_to_melbourne(utc_time_str):
        melbourne_zone = pytz.timezone('Australia/Melbourne')
        utc_time = pd.to_datetime(utc_time_str, utc=True)
        melbourne_time = utc_time.tz_convert(melbourne_zone)
        return melbourne_time

    columns_to_convert = ['lastupdated', 'status_timestamp']
    for column in columns_to_convert:
        if column in df.columns:
            df[column] = df[column].apply(lambda x: convert_utc_to_melbourne(x) if pd.notnull(x) else x)

    # Get data for the last 6 months
    end_time = pd.Timestamp.now(pytz.timezone('Australia/Melbourne'))
    start_time = end_time - pd.DateOffset(months=months_ago)
    df_filtered = df[(df['status_timestamp'] >= start_time) & (df['status_timestamp'] < end_time)]

    if df_filtered.empty:
        raise ValueError("No data found for the specified time window.")

    df_resampled = df_filtered.resample('1D', on='status_timestamp').agg({
        'kerbsideid': 'count'
    }).fillna(0)

    if df_resampled.empty:
        raise ValueError("No resampled data found for the specified time window.")

    scaler = MinMaxScaler(feature_range=(0, 1))
    df_resampled_scaled = scaler.fit_transform(df_resampled)

    return df_filtered, df_resampled, df_resampled_scaled, scaler

# Use 6 months of data
try:
    df, df_resampled, df_resampled_scaled, scaler = fetch_and_process_data(months_ago=6)
except ValueError as e:
    print(f"Error: {e}")
    exit()

# Prepare the dataset for Gradient Boosting Regressor
def create_lag_features(data, lag=1):
    df_lag = pd.DataFrame()
    df_lag['available_spots'] = data.flatten()
    for i in range(1, lag + 1):
        df_lag[f'lag_{i}'] = df_lag['available_spots'].shift(i)
    df_lag.dropna(inplace=True)
    return df_lag

lagged_data = create_lag_features(df_resampled_scaled, lag=30)  # Use 30-day lag for monthly forecasting
X = lagged_data.drop('available_spots', axis=1)
y = lagged_data['available_spots']

# Train the Gradient Boosting Regressor model
gbr_model = GradientBoostingRegressor(n_estimators=100)
gbr_model.fit(X[:-1], y[:-1])

# Forecast for the next 6 months (predict multiple steps)
forecast_gbr = []
current_input = X[-1:].copy()  # Start with the last available data point

for _ in range(6):  # Predict for the next 6 months
    next_forecast = gbr_model.predict(current_input)
    forecast_gbr.append(next_forecast[0])
    
    # Update the input with the new forecast (shift the window)
    current_input = current_input.shift(-1, axis=1)
    current_input.iloc[0, -1] = next_forecast  # Add the predicted value to the input

forecast_gbr = scaler.inverse_transform(pd.DataFrame(forecast_gbr))  # Inverse transform the forecasted values

# Data drift calculations (2 months apart data)
ks_stat_gbr, ks_p_value_gbr = ks_2samp(forecast_gbr.flatten(), y.values[-6:])  # Compare forecast vs last 6 months
emd_gbr = wasserstein_distance(forecast_gbr.flatten(), y.values[-6:])
jsd_gbr = jensenshannon(forecast_gbr.flatten(), y.values[-6:])

# Print Results for Gradient Boosting Regressor
print(f"Gradient Boosting Regressor Model:")
print(f"Kolmogorov-Smirnov Statistic: {ks_stat_gbr:.4f}, p-value: {ks_p_value_gbr:.4f}")
print(f"Earth Mover's Distance (EMD): {emd_gbr:.4f}")
print(f"Jensen-Shannon Divergence (JSD): {jsd_gbr:.4f}")

# Plot the bar graph with x and y axis labels
plt.figure(figsize=(10, 6))
plt.plot(df_resampled.index, df_resampled_scaled, label='Historical Data')
plt.plot(pd.date_range(df_resampled.index[-1], periods=7, freq='ME')[1:], forecast_gbr, label='Forecast (Gradient Boosting)', color='red')
plt.title("6-Month Parking Availability Forecast (Gradient Boosting)")
plt.xlabel("Date")  # X-axis label
plt.ylabel("Available Parking Spots (Normalized)")  # Y-axis label
plt.legend()
plt.show()

# List of 50 sample predicted parking spots, with kerbside IDs and date for availability
print("\nSample List of 50 Available Parking Spots (Predicted for Next 6 Months):")
kerbside_ids = ['KSID_' + str(i+1) for i in range(50)]  # Ensure we have enough kerbside IDs
forecast_dates = pd.date_range(df_resampled.index[-1], periods=7, freq='ME')[1:]  # Predicted dates

# Creating a sample list of 50 rows with kerbside ID, date, and available spots
sample_list = [{'KerbsideID': kerbside_ids[i], 
                'Date': forecast_dates[i % len(forecast_dates)].date(),  # Rotating through dates
                'AvailableSpots': round(forecast_gbr.flatten()[i % len(forecast_gbr.flatten())])}
               for i in range(50)]

# Display the first 50 rows
for sample in sample_list:
    print(f"Kerbside ID: {sample['KerbsideID']}, Date: {sample['Date']}, Available Spots: {sample['AvailableSpots']}")
Gradient Boosting Regressor Model:
Kolmogorov-Smirnov Statistic: 1.0000, p-value: 0.0022
Earth Mover's Distance (EMD): 35.8093
Jensen-Shannon Divergence (JSD): 0.6810
No description has been provided for this image
Sample List of 50 Available Parking Spots (Predicted for Next 6 Months):
Kerbside ID: KSID_1, Date: 2024-10-31, Available Spots: 20
Kerbside ID: KSID_2, Date: 2024-11-30, Available Spots: 54
Kerbside ID: KSID_3, Date: 2024-12-31, Available Spots: 40
Kerbside ID: KSID_4, Date: 2025-01-31, Available Spots: 17
Kerbside ID: KSID_5, Date: 2025-02-28, Available Spots: 70
Kerbside ID: KSID_6, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_7, Date: 2024-10-31, Available Spots: 20
Kerbside ID: KSID_8, Date: 2024-11-30, Available Spots: 54
Kerbside ID: KSID_9, Date: 2024-12-31, Available Spots: 40
Kerbside ID: KSID_10, Date: 2025-01-31, Available Spots: 17
Kerbside ID: KSID_11, Date: 2025-02-28, Available Spots: 70
Kerbside ID: KSID_12, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_13, Date: 2024-10-31, Available Spots: 20
Kerbside ID: KSID_14, Date: 2024-11-30, Available Spots: 54
Kerbside ID: KSID_15, Date: 2024-12-31, Available Spots: 40
Kerbside ID: KSID_16, Date: 2025-01-31, Available Spots: 17
Kerbside ID: KSID_17, Date: 2025-02-28, Available Spots: 70
Kerbside ID: KSID_18, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_19, Date: 2024-10-31, Available Spots: 20
Kerbside ID: KSID_20, Date: 2024-11-30, Available Spots: 54
Kerbside ID: KSID_21, Date: 2024-12-31, Available Spots: 40
Kerbside ID: KSID_22, Date: 2025-01-31, Available Spots: 17
Kerbside ID: KSID_23, Date: 2025-02-28, Available Spots: 70
Kerbside ID: KSID_24, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_25, Date: 2024-10-31, Available Spots: 20
Kerbside ID: KSID_26, Date: 2024-11-30, Available Spots: 54
Kerbside ID: KSID_27, Date: 2024-12-31, Available Spots: 40
Kerbside ID: KSID_28, Date: 2025-01-31, Available Spots: 17
Kerbside ID: KSID_29, Date: 2025-02-28, Available Spots: 70
Kerbside ID: KSID_30, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_31, Date: 2024-10-31, Available Spots: 20
Kerbside ID: KSID_32, Date: 2024-11-30, Available Spots: 54
Kerbside ID: KSID_33, Date: 2024-12-31, Available Spots: 40
Kerbside ID: KSID_34, Date: 2025-01-31, Available Spots: 17
Kerbside ID: KSID_35, Date: 2025-02-28, Available Spots: 70
Kerbside ID: KSID_36, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_37, Date: 2024-10-31, Available Spots: 20
Kerbside ID: KSID_38, Date: 2024-11-30, Available Spots: 54
Kerbside ID: KSID_39, Date: 2024-12-31, Available Spots: 40
Kerbside ID: KSID_40, Date: 2025-01-31, Available Spots: 17
Kerbside ID: KSID_41, Date: 2025-02-28, Available Spots: 70
Kerbside ID: KSID_42, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_43, Date: 2024-10-31, Available Spots: 20
Kerbside ID: KSID_44, Date: 2024-11-30, Available Spots: 54
Kerbside ID: KSID_45, Date: 2024-12-31, Available Spots: 40
Kerbside ID: KSID_46, Date: 2025-01-31, Available Spots: 17
Kerbside ID: KSID_47, Date: 2025-02-28, Available Spots: 70
Kerbside ID: KSID_48, Date: 2025-03-31, Available Spots: 15
Kerbside ID: KSID_49, Date: 2024-10-31, Available Spots: 20
Kerbside ID: KSID_50, Date: 2024-11-30, Available Spots: 54

11. Interpretation¶

The comparison between the Random Forest model and the Gradient Boosting Regressor model is based on three metrics: Kolmogorov-Smirnov Statistic (KS), Earth Mover's Distance (EMD), and Jensen-Shannon Divergence (JSD).

  1. Kolmogorov-Smirnov Statistic (KS):

Random Forest: KS = 1.0000, p-value = 0.0022 Gradient Boosting Regressor: KS = 1.0000, p-value = 0.0022 Both models have identical KS statistics and p-values. The KS statistic of 1.0000 suggests that there is a significant difference between the predicted distributions and the actual data. The low p-value (< 0.05) indicates that this difference is statistically significant for both models. Thus, neither model provides a perfect match with the actual data, and the drift is similar in both cases.

  1. Earth Mover's Distance (EMD):

Random Forest: EMD = 30.2349 Gradient Boosting Regressor: EMD = 38.9411 The Gradient Boosting Regressor has a higher EMD (38.9411) compared to the Random Forest model (30.2349). EMD measures the "effort" required to transform one distribution into another. A higher value indicates a greater difference between the predicted and actual distributions. In this case, the Random Forest model shows a smaller distance, suggesting that it provides predictions that are somewhat closer to the actual data compared to the Gradient Boosting model.

  1. Jensen-Shannon Divergence (JSD):

Random Forest: JSD = 0.5448 Gradient Boosting Regressor: JSD = 0.5185 The Gradient Boosting Regressor has a slightly lower JSD (0.5185) compared to the Random Forest model (0.5448). JSD is a symmetric measure of how similar two probability distributions are. A lower value indicates that the predicted and actual distributions are more similar. In this case, Gradient Boosting provides slightly better alignment with the actual data.

As a result, Kolmogorov-Smirnov Statistic: Both models perform equally in terms of KS and p-value, indicating a statistically significant difference between the predicted and actual distributions for both models.

Earth Mover's Distance (EMD): The Random Forest model outperforms Gradient Boosting in terms of being closer to the actual data. Jensen-Shannon Divergence (JSD): The Gradient Boosting Regressor model slightly outperforms the Random Forest model, showing better alignment between the predicted and actual distributions.

12. New API - Descriptive Statistics Analysis for the Dataset: 'dataset id: sign-plates-located-in-each-parking-zone-copy' ,¶

base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'

12.1. Load the dataset from API¶

In [32]:
import pandas as pd
import requests
from io import StringIO

# API details for 'sign-plates-located-in-each-parking-zone-copy'
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'sign-plates-located-in-each-parking-zone-copy'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
response = requests.get(url)
df = pd.read_csv(StringIO(response.text), delimiter=';')

# Now you can perform your analysis on 'df'
print("Dataset loaded successfully.")
Dataset loaded successfully.

12.2. Print the column names from the dataset¶

In [33]:
import pandas as pd
import requests
from io import StringIO

# API details for 'sign-plates-located-in-each-parking-zone-copy'
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'sign-plates-located-in-each-parking-zone-copy'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
response = requests.get(url)
df = pd.read_csv(StringIO(response.text), delimiter=';')

# Step 1: Print all column names to identify the correct names
print("Column Names in the Dataset:")
print(df.columns.tolist())
Column Names in the Dataset:
['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']

12.3. Total number of unique parking zones¶

In [34]:
import pandas as pd
import requests
from io import StringIO

# API details for 'sign-plates-located-in-each-parking-zone-copy'
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'sign-plates-located-in-each-parking-zone-copy'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
response = requests.get(url)
df = pd.read_csv(StringIO(response.text), delimiter=';')

# Step 1: Print all column names to identify the correct one for parking zones
print("Column Names in the Dataset:")
print(df.columns.tolist())

# Step 2: Assuming you now know the correct column name for parking zones
correct_column_name = 'parkingzone'  # Replace with the actual column name after inspecting

# Step 3: Find and print the total number of unique parking zones
if correct_column_name in df.columns:
    total_zones = df[correct_column_name].nunique()
    print(f"\nTotal number of unique parking zones: {total_zones}")
else:
    print(f"\nColumn '{correct_column_name}' not found in the dataset.")
Column Names in the Dataset:
['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']

Total number of unique parking zones: 678

12.4. List the restriction bay zones and duration¶

In [35]:
import pandas as pd
import requests
from io import StringIO

# API details for 'sign-plates-located-in-each-parking-zone-copy'
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'sign-plates-located-in-each-parking-zone-copy'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
response = requests.get(url)
df = pd.read_csv(StringIO(response.text), delimiter=';')

# Step 1: Print all column names to identify the correct column for parking zones
print("Column Names in the Dataset:")
print(df.columns.tolist())

# Step 2: Once the correct column name is identified, replace 'ParkingZone' with the actual column name
# For this example, let's assume the column is called 'Zone'
correct_column_name = 'parkingzone'  # Replace 'Zone' with the actual column name for parking zones
restriction_column = 'restriction_display'  # Assuming 'Restriction_Display' is the correct column for restrictions

# Define a function to categorize parking zones based on 'Restriction_Display'
def categorize_parking(restriction_display):
    if pd.isnull(restriction_display):
        return 'Unknown'
    elif '1P' in restriction_display:
        return '1P'
    elif '2P' in restriction_display:
        return '2P'
    elif '3P' in restriction_display:
        return '3P'
    elif '4P' in restriction_display:
        return '4P'
    else:
        return 'Other'

# Apply the categorization function to the 'Restriction_Display' column
if restriction_column in df.columns:
    df['Parking_Category'] = df[restriction_column].apply(categorize_parking)

    # Step 3: Print the first few rows of the categorized dataset
    print("\nParking Zones categorized by restriction display:")
    print(df[[correct_column_name, restriction_column, 'Parking_Category']].head())
else:
    print(f"\nColumn '{restriction_column}' not found in the dataset.")
Column Names in the Dataset:
['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']

Parking Zones categorized by restriction display:
   parkingzone restriction_display Parking_Category
0         7445                  2P               2P
1         7446                  2P               2P
2         7449                  2P               2P
3         7450                  2P               2P
4         7452                  2P               2P

12.5. Calculate How many different types of parking duration as 1P,2P,3P and 4P¶

In [36]:
import pandas as pd
import requests
from io import StringIO

# API details for 'sign-plates-located-in-each-parking-zone-copy'
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'sign-plates-located-in-each-parking-zone-copy'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
response = requests.get(url)
df = pd.read_csv(StringIO(response.text), delimiter=';')

# Step 1: Print all column names to identify the correct column for parking zones
print("Column Names in the Dataset:")
print(df.columns.tolist())

# Step 2: Once the correct column name is identified, replace 'ParkingZone' with the actual column name
# For this example, let's assume the column is called 'parkingzone'
correct_column_name = 'parkingzone'  # Replace with actual column name if different
restriction_column = 'restriction_display'  # Replace with actual column name if different

# Define a function to categorize parking zones based on 'restriction_display'
def categorize_parking(restriction_display):
    if pd.isnull(restriction_display):
        return 'Unknown'
    elif '1P' in restriction_display:
        return '1P'
    elif '2P' in restriction_display:
        return '2P'
    elif '3P' in restriction_display:
        return '3P'
    elif '4P' in restriction_display:
        return '4P'
    else:
        return 'Other'

# Apply the categorization function to the 'restriction_display' column
if restriction_column in df.columns:
    df['Parking_Category'] = df[restriction_column].apply(categorize_parking)

    # Step 3: Print the first few rows of the categorized dataset
    print("\nParking Zones categorized by restriction display:")
    print(df[[correct_column_name, restriction_column, 'Parking_Category']].head())

    # Step 4: Count how many 1P, 2P, 3P, and 4P categories there are
    category_counts = df['Parking_Category'].value_counts()

    print("\nCount of Parking Categories:")
    print(category_counts[['1P', '2P', '3P', '4P']].fillna(0))  # Fill with 0 if any category is missing
else:
    print(f"\nColumn '{restriction_column}' not found in the dataset.")
Column Names in the Dataset:
['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']

Parking Zones categorized by restriction display:
   parkingzone restriction_display Parking_Category
0         7445                  2P               2P
1         7446                  2P               2P
2         7449                  2P               2P
3         7450                  2P               2P
4         7452                  2P               2P

Count of Parking Categories:
Parking_Category
1P    182
2P    670
3P     60
4P    130
Name: count, dtype: int64

12.6. Visualization of Parking Restrictions¶

In [37]:
import pandas as pd
import requests
from io import StringIO
import matplotlib.pyplot as plt

# API details for 'sign-plates-located-in-each-parking-zone-copy'
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'sign-plates-located-in-each-parking-zone-copy'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
response = requests.get(url)
df = pd.read_csv(StringIO(response.text), delimiter=';')

# Step 1: Print all column names to identify the correct column for parking zones
print("Column Names in the Dataset:")
print(df.columns.tolist())

# Step 2: Once the correct column name is identified, replace 'ParkingZone' with the actual column name
correct_column_name = 'parkingzone'  # Replace with actual column name if different
restriction_column = 'restriction_display'  # Replace with actual column name if different

# Define a function to categorize parking zones based on 'restriction_display'
def categorize_parking(restriction_display):
    if pd.isnull(restriction_display):
        return 'Unknown'
    elif '1P' in restriction_display:
        return '1P'
    elif '2P' in restriction_display:
        return '2P'
    elif '3P' in restriction_display:
        return '3P'
    elif '4P' in restriction_display:
        return '4P'
    else:
        return 'Other'

# Apply the categorization function to the 'restriction_display' column
if restriction_column in df.columns:
    df['Parking_Category'] = df[restriction_column].apply(categorize_parking)

    # Step 3: Print the first few rows of the categorized dataset
    print("\nParking Zones categorized by restriction display:")
    print(df[[correct_column_name, restriction_column, 'Parking_Category']].head())

    # Step 4: Count how many 1P, 2P, 3P, and 4P categories there are
    category_counts = df['Parking_Category'].value_counts()

    print("\nCount of Parking Categories:")
    print(category_counts[['1P', '2P', '3P', '4P']].fillna(0))  # Fill with 0 if any category is missing

    # Step 5: Plot the bar graph
    category_counts[['1P', '2P', '3P', '4P']].fillna(0).plot(kind='bar', color='skyblue')
    plt.title('Number of Parking Duration Categories')
    plt.xlabel('Parking Duration')
    plt.ylabel('Count')
    plt.xticks(rotation=0)
    plt.tight_layout()
    plt.show()

else:
    print(f"\nColumn '{restriction_column}' not found in the dataset.")
Column Names in the Dataset:
['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']

Parking Zones categorized by restriction display:
   parkingzone restriction_display Parking_Category
0         7445                  2P               2P
1         7446                  2P               2P
2         7449                  2P               2P
3         7450                  2P               2P
4         7452                  2P               2P

Count of Parking Categories:
Parking_Category
1P    182
2P    670
3P     60
4P    130
Name: count, dtype: int64
No description has been provided for this image

12.7. Correlation Analysis¶

In [38]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# Convert any time-related columns to datetime, handling any issues in conversion
df['time_restrictions_start'] = pd.to_datetime(df['time_restrictions_start'], errors='coerce')
df['time_restrictions_finish'] = pd.to_datetime(df['time_restrictions_finish'], errors='coerce')

# Ensure both columns have valid datetime values before performing the subtraction
valid_mask = df['time_restrictions_start'].notnull() & df['time_restrictions_finish'].notnull()

# Create a restriction duration column (in hours) where valid values exist
df.loc[valid_mask, 'restriction_duration'] = (
    (df['time_restrictions_finish'] - df['time_restrictions_start']).dt.total_seconds() / 3600
)

# Perform correlation analysis on numeric columns
numeric_columns = df.select_dtypes(include=[np.number])

# Check if the numeric columns contain any valid data
if not numeric_columns.empty:
    correlation_matrix = numeric_columns.corr()

    # Visualize the correlation matrix
    plt.figure(figsize=(8, 6))
    sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', linewidths=0.5)
    plt.title('Correlation Matrix of Numeric Variables')
    plt.show()
else:
    print("No numeric columns available for correlation analysis.")
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\2565017150.py:7: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  df['time_restrictions_start'] = pd.to_datetime(df['time_restrictions_start'], errors='coerce')
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\2565017150.py:8: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  df['time_restrictions_finish'] = pd.to_datetime(df['time_restrictions_finish'], errors='coerce')
No description has been provided for this image

12.8. Filtering and Finding Specific Zones¶

filter zones based on specific conditions, such as zones with restrictions on weekends, or zones with long restriction durations.

In [24]:
import pandas as pd
import requests
from io import StringIO
import matplotlib.pyplot as plt
import seaborn as sns

# API details for 'sign-plates-located-in-each-parking-zone-copy'
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'sign-plates-located-in-each-parking-zone-copy'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
response = requests.get(url)
df = pd.read_csv(StringIO(response.text), delimiter=';')

# Step 1: Print column names to inspect the data
print("Column Names in the Dataset:")
print(df.columns.tolist())

# Convert any time-related columns to datetime, handling any issues in conversion
df['time_restrictions_start'] = pd.to_datetime(df['time_restrictions_start'], errors='coerce')
df['time_restrictions_finish'] = pd.to_datetime(df['time_restrictions_finish'], errors='coerce')

# Ensure both columns have valid datetime values before performing the subtraction
valid_mask = df['time_restrictions_start'].notnull() & df['time_restrictions_finish'].notnull()

# Create a restriction duration column (in hours) where valid values exist
df.loc[valid_mask, 'restriction_duration'] = (
    (df['time_restrictions_finish'] - df['time_restrictions_start']).dt.total_seconds() / 3600
)

# Step 2: Filter zones with restrictions on weekends
# Catch any rows with 'Sat', 'Sun', 'Sat-Sun', etc. in the 'restriction_days' column
weekend_zones = df[df['restriction_days'].str.contains('Sat|Sun', na=False)]
print("\nZones with restrictions on weekends:")
print(weekend_zones[['parkingzone', 'restriction_days', 'restriction_display']].head())

# Step 3: Filter zones with longer restriction durations (e.g., 2P, 3P, or 4P)
long_restriction_zones = df[df['restriction_display'].str.contains('2P|3P|4P', na=False)]
print("\nZones with restriction durations longer than 2 hours:")
print(long_restriction_zones[['parkingzone', 'restriction_days', 'restriction_display']].head())

# Optional: Perform correlation analysis on numeric columns
numeric_columns = df.select_dtypes(include=[float, int])

# Check if the numeric columns contain any valid data
if not numeric_columns.empty:
    correlation_matrix = numeric_columns.corr()

    # Visualize the correlation matrix
    plt.figure(figsize=(8, 6))
    sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', linewidths=0.5)
    plt.title('Correlation Matrix of Numeric Variables')
    plt.show()
else:
    print("No numeric columns available for correlation analysis.")
Column Names in the Dataset:
['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']

Zones with restrictions on weekends:
   parkingzone restriction_days restriction_display
2         7449          Mon-Sat                  2P
3         7450          Sat-Sun                  2P
5         7452          Sat-Sun                  2P
6         7454          Sat-Sun                  2P
7         7471              Sat                  2P

Zones with restriction durations longer than 2 hours:
   parkingzone restriction_days restriction_display
0         7445          Mon-Fri                  2P
1         7446          Mon-Fri                  2P
2         7449          Mon-Sat                  2P
3         7450          Sat-Sun                  2P
4         7452          Mon-Fri                  2P
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\680063578.py:21: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  df['time_restrictions_start'] = pd.to_datetime(df['time_restrictions_start'], errors='coerce')
C:\Users\ssgul\AppData\Local\Temp\ipykernel_24480\680063578.py:22: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  df['time_restrictions_finish'] = pd.to_datetime(df['time_restrictions_finish'], errors='coerce')
No description has been provided for this image

12.9. Time Series Analysis¶

Perform a time series analysis on parking restrictions.

In [25]:
import pandas as pd
import requests
from io import StringIO

# API details for the first dataset: 'sign-plates-located-in-each-parking-zone-copy'
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

# Fetch the first dataset (Parking Zones dataset)
response_1 = requests.get(url_1)
df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')

# API details for the second dataset: 'on-street-parking-bay-sensors'
base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch the second dataset (Parking Bay Sensors dataset)
response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Step 1: Inspect column names from both datasets
print("Column Names in 'sign-plates-located-in-each-parking-zone-copy' dataset:")
print(df_1.columns.tolist())
print("\nColumn Names in 'on-street-parking-bay-sensors' dataset:")
print(df_2.columns.tolist())

# Step 2: Extract the 'ParkingZone' column from the first dataset (df_1)
# Replace 'ParkingZone' with the actual column name if different
if 'parkingzone' in df_1.columns:
    parking_zones = df_1['parkingzone'].dropna().unique()
else:
    print("Column 'ParkingZone' not found in the first dataset.")
    parking_zones = []

# Step 3: Filter the second dataset (df_2) based on the extracted 'ParkingZone' values
# Replace 'zone_number' with the actual column name in the second dataset if different
if 'zone_number' in df_2.columns:
    filtered_df_2 = df_2[df_2['zone_number'].isin(parking_zones)]
else:
    print("Column 'zone_number' not found in the second dataset.")
    filtered_df_2 = pd.DataFrame()

# Step 4: Print the first few rows of the filtered dataset
print("\nFiltered data from 'on-street-parking-bay-sensors' based on 'ParkingZone':")
print(filtered_df_2.head())

# Step 5: Perform any desired analysis on the filtered dataset (optional)
# Example: Count the number of entries per zone
zone_count = filtered_df_2['zone_number'].value_counts()
print("\nCount of entries per 'zone_number':")
print(zone_count.head())
Column Names in 'sign-plates-located-in-each-parking-zone-copy' dataset:
['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']

Column Names in 'on-street-parking-bay-sensors' dataset:
['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']

Filtered data from 'on-street-parking-bay-sensors' based on 'ParkingZone':
                 lastupdated           status_timestamp  zone_number  \
0  2023-12-14T04:45:34+00:00  2023-12-14T03:41:25+00:00       7695.0   
1  2023-12-14T04:45:34+00:00  2023-12-13T06:21:58+00:00       7939.0   
4  2023-12-18T04:45:34+00:00  2023-12-17T23:47:54+00:00       7310.0   
5  2023-12-18T04:45:34+00:00  2023-11-02T00:47:52+00:00       7050.0   
6  2023-12-18T04:45:34+00:00  2023-12-18T04:03:50+00:00       7310.0   

  status_description  kerbsideid                                 location  
0         Unoccupied       22959   -37.81844776554182, 144.95938672872117  
1         Unoccupied       10136    -37.8099909364941, 144.95263753679632  
4         Unoccupied        6497   -37.81044576734748, 144.95648958199024  
5            Present        8958   -37.80588632122739, 144.95989190405095  
6         Unoccupied       25139  -37.810361269606986, 144.95724275778542  

Count of entries per 'zone_number':
zone_number
7566.0    96
7833.0    84
7250.0    76
7025.0    70
7556.0    68
Name: count, dtype: int64

13. Use two API Datasets to make calculation¶

Use the zone_number column from the API dataset_id_2 = 'on-street-parking-bay-sensors' and use this column values to find the calculation of the total count of parkingzones in the dataset dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy

In [26]:
import pandas as pd 
import requests
from io import StringIO

# API details for the first dataset: 'sign-plates-located-in-each-parking-zone-copy'
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

# Fetch the first dataset (Parking Zones dataset)
response_1 = requests.get(url_1)
df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')

# API details for the second dataset: 'on-street-parking-bay-sensors'
base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch the second dataset (Parking Bay Sensors dataset)
response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Step 1: Inspect column names from both datasets
print("Column Names in 'sign-plates-located-in-each-parking-zone-copy' dataset:")
print(df_1.columns.tolist())
print("\nColumn Names in 'on-street-parking-bay-sensors' dataset:")
print(df_2.columns.tolist())

# Step 2: Extract the 'ParkingZone' column from the first dataset (df_1)
# Replace 'ParkingZone' with the actual column name if different
if 'parkingzone' in df_1.columns:
    parking_zones = df_1['parkingzone'].dropna().unique()
else:
    print("Column 'ParkingZone' not found in the first dataset.")
    parking_zones = []

# Step 3: Filter the second dataset (df_2) based on the extracted 'ParkingZone' values
# Replace 'zone_number' with the actual column name in the second dataset if different
if 'zone_number' in df_2.columns:
    filtered_df_2 = df_2[df_2['zone_number'].isin(parking_zones)]
else:
    print("Column 'zone_number' not found in the second dataset.")
    filtered_df_2 = pd.DataFrame()

# Step 4: Print the first few rows of the filtered dataset
print("\nFiltered data from 'on-street-parking-bay-sensors' based on 'ParkingZone':")
print(filtered_df_2.head())

# Step 5: Perform any desired analysis on the filtered dataset (optional)
# Example: Count the number of entries per zone
zone_count = filtered_df_2['zone_number'].value_counts()
print("\nCount of entries per 'zone_number':")
print(zone_count.head())
Column Names in 'sign-plates-located-in-each-parking-zone-copy' dataset:
['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']

Column Names in 'on-street-parking-bay-sensors' dataset:
['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']

Filtered data from 'on-street-parking-bay-sensors' based on 'ParkingZone':
                 lastupdated           status_timestamp  zone_number  \
0  2023-12-14T04:45:34+00:00  2023-12-14T03:41:25+00:00       7695.0   
1  2023-12-14T04:45:34+00:00  2023-12-13T06:21:58+00:00       7939.0   
4  2023-12-18T04:45:34+00:00  2023-12-17T23:47:54+00:00       7310.0   
5  2023-12-18T04:45:34+00:00  2023-11-02T00:47:52+00:00       7050.0   
6  2023-12-18T04:45:34+00:00  2023-12-18T04:03:50+00:00       7310.0   

  status_description  kerbsideid                                 location  
0         Unoccupied       22959   -37.81844776554182, 144.95938672872117  
1         Unoccupied       10136    -37.8099909364941, 144.95263753679632  
4         Unoccupied        6497   -37.81044576734748, 144.95648958199024  
5            Present        8958   -37.80588632122739, 144.95989190405095  
6         Unoccupied       25139  -37.810361269606986, 144.95724275778542  

Count of entries per 'zone_number':
zone_number
7566.0    96
7833.0    84
7250.0    76
7025.0    70
7556.0    68
Name: count, dtype: int64

13.1. Using two datasets from APIs¶

For calculating the parked vehicles currently according to parkingzone column in dataset dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'.

In [15]:
import pandas as pd 
import requests
from io import StringIO

# API details for the first dataset: 'sign-plates-located-in-each-parking-zone-copy'
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

# Fetch the first dataset (Parking Zones dataset)
response_1 = requests.get(url_1)
df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')

# API details for the second dataset: 'on-street-parking-bay-sensors'
base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch the second dataset (Parking Bay Sensors dataset)
response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Step 1: Inspect column names from both datasets
print("Column Names in 'sign-plates-located-in-each-parking-zone-copy' dataset:")
print(df_1.columns.tolist())
print("\nColumn Names in 'on-street-parking-bay-sensors' dataset:")
print(df_2.columns.tolist())

# Step 2: Extract the 'ParkingZone' column from the first dataset (df_1)
# Replace 'parkingzone' with the actual column name if different
if 'parkingzone' in df_1.columns:
    parking_zones = df_1['parkingzone'].dropna().unique()
else:
    print("Column 'ParkingZone' not found in the first dataset.")
    parking_zones = []

#. Step 3: Filter the second dataset (df_2) based on the extracted 'ParkingZone' values
# Replace 'zone_number' and 'status_description' with the actual column names in the second dataset if different
if 'zone_number' in df_2.columns and 'status_description' in df_2.columns:
    # Filter the second dataset to get only the rows where vehicles are currently parked (status_description == 'Present')
    filtered_df_2 = df_2[(df_2['zone_number'].isin(parking_zones)) & (df_2['status_description'] == 'Present')]
else:
    print("Required columns 'zone_number' or 'status_description' not found in the second dataset.")
    filtered_df_2 = pd.DataFrame()

# Step 4: Calculate the number of parked vehicles for each ParkingZone
if not filtered_df_2.empty:
    parked_vehicles_by_zone = filtered_df_2['zone_number'].value_counts()
    print("\nNumber of currently parked vehicles by 'ParkingZone':")
    print(parked_vehicles_by_zone.head())  # Print the first few results
else:
    print("No data available for parked vehicles.")

# Step 5: Optional - Merge this data back with the first dataset if needed
df_1_with_parked_vehicles = pd.merge(df_1, parked_vehicles_by_zone.rename('Parked_Vehicles'), left_on='parkingzone', right_index=True, how='left')
print("\nFirst few rows of 'sign-plates-located-in-each-parking-zone-copy' dataset with parked vehicles:")
print(df_1_with_parked_vehicles.head())
Column Names in 'sign-plates-located-in-each-parking-zone-copy' dataset:
['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']

Column Names in 'on-street-parking-bay-sensors' dataset:
['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']

Number of currently parked vehicles by 'ParkingZone':
zone_number
7556.0    54
7566.0    49
7034.0    48
7833.0    40
7178.0    37
Name: count, dtype: int64

First few rows of 'sign-plates-located-in-each-parking-zone-copy' dataset with parked vehicles:
   parkingzone restriction_days time_restrictions_start  \
0         7445          Mon-Fri                16:00:00   
1         7446          Mon-Fri                16:00:00   
2         7449          Mon-Sat                07:30:00   
3         7450          Sat-Sun                07:00:00   
4         7452          Mon-Fri                16:00:00   

  time_restrictions_finish restriction_display  Parked_Vehicles  
0                 20:30:00                  2P              2.0  
1                 22:00:00                  2P              1.0  
2                 20:30:00                  2P             27.0  
3                 22:00:00                  2P              4.0  
4                 22:00:00                  2P              4.0  

14. User Behaviour Analysis¶

User behaviour analysis mostly depends on the completeness of the datasets. For understanding the user's habits, and daily behaviour, it is required to know about some of the details of the user. One of the important property is the user's vehicle registration number. This helps to track the vehicle such as when he usually does parking or where he prefers to park. In addition to this, if the driver uses the car parking app, and can give some of the details about himself/herself, such as why he/she comes to city to park, when he prefers to drive and park (in which weather condition>) and also parking violation data can be accessible if the vehicle can be tracked. So in this project, under user behaviour analysis, only the given features were used with the provided datasets. So analysis in this title were restricted with the dataset features.

14.1. Parking Space Utilization¶

In [1]:
import pandas as pd
import pytz
from datetime import datetime, timedelta

if not pd.api.types.is_datetime64_dtype(df['lastupdated']):
    try:
        # Attempt conversion if possible
        df['lastupdated'] = pd.to_datetime(df['lastupdated'])
    except (ValueError, pandas.errors.ParserError):
        print("Error: 'lastupdated' column could not be converted to datetime format.")

# 2. Get current time in Australia/Melbourne timezone (adjust if needed)
current_time_melbourne = datetime.now(pytz.timezone('Australia/Melbourne'))

# 3. Calculate the threshold for the last hour
last_hour_threshold = current_time_melbourne - timedelta(hours=1)

# 4. Filter the DataFrame
df_last_hour = df[df['lastupdated'] >= last_hour_threshold]

# Now 'df_last_hour' contains rows with 'lastupdated' within the last hour
print(df_last_hour)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[1], line 5
      2 import pytz
      3 from datetime import datetime, timedelta
----> 5 if not pd.api.types.is_datetime64_dtype(df['lastupdated']):
      6     try:
      7         # Attempt conversion if possible
      8         df['lastupdated'] = pd.to_datetime(df['lastupdated'])

NameError: name 'df' is not defined

14.2 Analyzing Parking Bay Utilization Rates by Kerbside ID¶

This code fetches real-time parking sensor data from Melbourne's open API and processes it to calculate parking bay utilization rates. It begins by loading the dataset and converting the lastupdated column to a timezone-aware datetime format (UTC). Data is then filtered to include only the past day's records. By grouping data by kerbsideid and analyzing the status_description column, the utilization rate is calculated as the percentage of time each parking bay was occupied. This analysis helps assess parking demand efficiently.

In [17]:
import pandas as pd
import requests
from io import StringIO
import pytz
from datetime import datetime, timedelta

# API details
base_url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id = 'on-street-parking-bay-sensors'

# Fetch the dataset from the API
url = f"{base_url}{dataset_id}/exports/csv"
response = requests.get(url)
df = pd.read_csv(StringIO(response.text), delimiter=';')

# Convert 'lastupdated' to datetime, assuming UTC timezone
df['lastupdated'] = pd.to_datetime(df['lastupdated'], utc=True)

# Filter for the last day (adjust time range as needed)
last_day = datetime.now(pytz.timezone('Australia/Melbourne')) - timedelta(days=1)
df_last_day = df[df['lastupdated'] >= last_day]

# Group by kerbside_id and calculate utilization rate
kerbside_utilization = df_last_day.groupby('kerbsideid')['status_description'].apply(
    lambda x: (x == 'occupied').mean() * 100
).reset_index(name='utilization_rate')

# Print the results
print(kerbside_utilization)
      kerbsideid  utilization_rate
0           5691               0.0
1           5706               0.0
2           5726               0.0
3           5734               0.0
4           5736               0.0
...          ...               ...
3291       69976               0.0
3292       69977               0.0
3293       69978               0.0
3294       69979               0.0
3295       90812               0.0

[3296 rows x 2 columns]

14.3. Fetching for Parking Zone Utilization - Number of the Parked Vehicles by Zone¶

This code fetches two datasets from Melbourne's open data portal: one detailing parking zone sign plates and another providing on-street parking sensor information. After importing the necessary libraries, it loads both datasets into pandas DataFrames. The code filters the sensor data to include only currently occupied parking bays (status_description equals 'Present'). It then counts the number of parked vehicles in each parking zone by using the 'zone_number' field. Finally, it prints out the number of parked vehicles per parking zone, offering insights into parking utilization across different areas.

In [22]:
import pandas as pd
import requests
from io import StringIO

# Fetch Dataset 1: Parking Zone Sign Plates
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"
response_1 = requests.get(url_1)
df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')

# Fetch Dataset 2: On-Street Parking Sensors
base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"
response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Calculate number of parked vehicles by parking zone
parked_vehicles = df_2[df_2['status_description'] == 'Present']
parked_vehicles_by_zone = parked_vehicles['zone_number'].value_counts()

print("Number of parked vehicles by parking zone:")
print(parked_vehicles_by_zone)
Number of parked vehicles by parking zone:
zone_number
7556.0    54
7566.0    49
7034.0    48
7833.0    40
7570.0    38
          ..
7685.0     1
7927.0     1
7681.0     1
7133.0     1
7020.0     1
Name: count, Length: 466, dtype: int64

14.4. Calculating Parking Zone Utilization Rates¶

In [23]:
import pandas as pd
import requests
from io import StringIO

# Fetch Dataset 1: Parking Zone Sign Plates
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"
response_1 = requests.get(url_1)
df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')

# Fetch Dataset 2: On-Street Parking Sensors
base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"
response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Example total bays data
total_bays = {'7556.0': 50, '7566.0': 40, '7034.0': 35}  # Replace with real data
df_1['total_bays'] = df_1['parkingzone'].apply(lambda x: total_bays.get(x, 10))  # Default 10 bays

# Merge parked vehicle counts into the first dataset
parked_vehicles = df_2[df_2['status_description'] == 'Present']
parked_vehicles_by_zone = parked_vehicles['zone_number'].value_counts()
df_1 = pd.merge(df_1, parked_vehicles_by_zone.rename('Parked_Vehicles'), left_on='parkingzone', right_index=True, how='left')

# Calculate utilization rates
df_1['Utilization_Rate'] = (df_1['Parked_Vehicles'] / df_1['total_bays']) * 100
print("Parking Zone Utilization Rates:")
print(df_1[['parkingzone', 'Utilization_Rate']])
Parking Zone Utilization Rates:
      parkingzone  Utilization_Rate
0            7445              20.0
1            7446              20.0
2            7449             270.0
3            7450              50.0
4            7452              30.0
...           ...               ...
1153         7433               NaN
1154         7434              40.0
1155         7436              60.0
1156         7440               NaN
1157         7441              10.0

[1158 rows x 2 columns]

14.5. Identifying Peak Parking Times¶

In [24]:
import pandas as pd
import requests
from io import StringIO

# Fetch Dataset 2: On-Street Parking Sensors
base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"
response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Convert timestamps to datetime and extract hours
df_2['status_timestamp'] = pd.to_datetime(df_2['status_timestamp'], errors='coerce')
df_2['hour'] = df_2['status_timestamp'].dt.hour

# Group by hour to identify peak times
peak_hours = df_2[df_2['status_description'] == 'Present'].groupby('hour').size()
print("Peak parking times (number of parked vehicles by hour):")
print(peak_hours)
Peak parking times (number of parked vehicles by hour):
hour
0     233
1     236
2     202
3     160
4     120
5     154
6     277
7     368
8     495
9     556
10     37
11     20
12     26
13     10
14     12
15      7
16     11
17      4
18     13
19     38
20     59
21     85
22    154
23    210
dtype: int64

14.6. Analyzing Parking Violations - Analyze If the time limit of the car parking is over¶

In [2]:
import pandas as pd
import requests
from io import StringIO

# Fetch Dataset 2: On-Street Parking Sensors
base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"
response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Filter rows where vehicles are currently parked
parked_vehicles = df_2[df_2['status_description'] == 'Present']

# Total number of parking events
total_parking_events = len(parked_vehicles)

# Number of unique parking zones with parked vehicles
unique_zones = parked_vehicles['zone_number'].nunique()

# Parking counts by zone
parking_counts_by_zone = parked_vehicles['zone_number'].value_counts()

# Average and maximum number of parked vehicles per zone
average_parked_vehicles = parking_counts_by_zone.mean()
max_parked_vehicles = parking_counts_by_zone.max()
zone_with_max_vehicles = parking_counts_by_zone.idxmax()

# Output statistical information
print("Statistical Information:")
print(f"Total number of parking events: {total_parking_events}")
print(f"Number of unique parking zones: {unique_zones}")
print(f"Average number of parked vehicles per zone: {average_parked_vehicles:.2f}")
print(f"Maximum number of parked vehicles in a single zone: {max_parked_vehicles}")
print(f"Zone with the maximum parked vehicles: {zone_with_max_vehicles}")
print("\nParking Counts by Zone (Top 10):")
print(parking_counts_by_zone.head(10))
Statistical Information:
Total number of parking events: 1368
Number of unique parking zones: 258
Average number of parked vehicles per zone: 4.95
Maximum number of parked vehicles in a single zone: 22
Zone with the maximum parked vehicles: 7556.0

Parking Counts by Zone (Top 10):
zone_number
7556.0    22
7725.0    21
7634.0    19
7178.0    18
7721.0    18
7551.0    17
7549.0    16
7639.0    16
7571.0    16
7605.0    16
Name: count, dtype: int64

14.7. Total Parked Vehicles by Kerbside ID without defining exact dates¶

In [3]:
import pandas as pd
import requests
from io import StringIO

# Fetch Dataset 2: On-Street Parking Sensors
base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"
response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Filter rows where vehicles are currently parked
parked_vehicles = df_2[df_2['status_description'] == 'Present'].copy()

# Calculate total parked vehicles for each kerbsideid
total_parked_by_kerbside = parked_vehicles.groupby('kerbsideid').size().reset_index(name='total_parked_vehicles')

# Sort by total parked vehicles in descending order
total_parked_by_kerbside = total_parked_by_kerbside.sort_values(by='total_parked_vehicles', ascending=False)

# Output the results
print("Total Parked Vehicles by Kerbside ID:")
print(total_parked_by_kerbside)
Total Parked Vehicles by Kerbside ID:
      kerbsideid  total_parked_vehicles
0           5736                      1
909        60132                      1
917        60425                      1
916        60424                      1
915        60230                      1
...          ...                    ...
454        20581                      1
453        20578                      1
452        20577                      1
451        20576                      1
1367       69977                      1

[1368 rows x 2 columns]

14.8. Daily Parked Vehicles by Kerbside ID for the Last 7 Days (from 2024-11-25 to 2024-12-02)¶

Behavioral Analysis

In [ ]:
import pandas as pd
import requests
from io import StringIO
from datetime import datetime, timedelta

# Fetch Dataset 2: On-Street Parking Sensors
base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"
response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Filter rows where vehicles are currently parked
parked_vehicles = df_2[df_2['status_description'] == 'Present'].copy()

# Convert timestamp column to datetime
parked_vehicles['status_timestamp'] = pd.to_datetime(parked_vehicles['status_timestamp'])

# Extract the date from the timestamp
parked_vehicles['date'] = parked_vehicles['status_timestamp'].dt.date

# Define the last 7 days
today = datetime.today().date()
last_week_start = today - timedelta(days=7)

# Filter data for the last 7 days
last_week_data = parked_vehicles[parked_vehicles['date'] >= last_week_start]

# Group data by date and kerbsideid for daily parked vehicle counts
daily_kerbside_report = last_week_data.groupby(['date', 'kerbsideid']).size().reset_index(name='daily_parked_vehicle_count')

# Group data by kerbsideid for total parked vehicle counts across the dataset
total_parked_by_kerbside = parked_vehicles.groupby('kerbsideid').size().reset_index(name='total_parked_vehicles')

# Sort daily report by date and kerbsideid
daily_kerbside_report = daily_kerbside_report.sort_values(by=['date', 'kerbsideid'])

# Sort total parked vehicles by kerbsideid
total_parked_by_kerbside = total_parked_by_kerbside.sort_values(by='total_parked_vehicles', ascending=False)

# Output the daily report for the last 7 days
print(f"Daily Parked Vehicles by Kerbside ID for the Last 7 Days (from {last_week_start} to {today}):")
for date in daily_kerbside_report['date'].unique():
    print(f"\nDate: {date}")
    date_data = daily_kerbside_report[daily_kerbside_report['date'] == date]
    print(date_data[['kerbsideid', 'daily_parked_vehicle_count']])

# Output the total parked vehicles across the dataset
print("\nTotal Parked Vehicles by Kerbside ID Across the Dataset:")
print(total_parked_by_kerbside)

import tkinter as tk

def run_code():
    label.config(text="Code is running!")

# Create the main application window
root = tk.Tk()
root.title("Run Code")
root.geometry("200x100")

# Add a label and a button
label = tk.Label(root, text="Click the button to run code.")
label.pack(pady=10)
run_button = tk.Button(root, text="Run Code", command=run_code)
run_button.pack(pady=10)

# Start the GUI loop
root.mainloop()
Daily Parked Vehicles by Kerbside ID for the Last 7 Days (from 2024-11-25 to 2024-12-02):

Date: 2024-11-26
   kerbsideid  daily_parked_vehicle_count
0       12093                           1
1       24368                           1

Date: 2024-11-27
   kerbsideid  daily_parked_vehicle_count
2       24369                           1
3       24423                           1

Date: 2024-11-28
    kerbsideid  daily_parked_vehicle_count
4         8729                           1
5         8731                           1
6         8733                           1
7         8734                           1
8         8735                           1
9         8738                           1
10        8750                           1
11        8752                           1
12        8754                           1
13       24044                           1

Date: 2024-11-29
    kerbsideid  daily_parked_vehicle_count
14       10296                           1
15       10717                           1
16       10727                           1
17       10732                           1
18       11264                           1
19       12125                           1
20       57316                           1
21       58119                           1

Date: 2024-11-30
    kerbsideid  daily_parked_vehicle_count
22       10287                           1
23       10722                           1
24       10726                           1
25       13138                           1
26       20575                           1
27       23977                           1
28       24052                           1
29       60218                           1
30       60738                           1
31       64111                           1

Date: 2024-12-01
     kerbsideid  daily_parked_vehicle_count
32         5931                           1
33         5943                           1
34         7866                           1
35         9431                           1
36         9438                           1
..          ...                         ...
116       65163                           1
117       65619                           1
118       66429                           1
119       66447                           1
120       67434                           1

[89 rows x 2 columns]

Date: 2024-12-02
      kerbsideid  daily_parked_vehicle_count
121         5921                           1
122         5922                           1
123         5923                           1
124         5924                           1
125         5926                           1
...          ...                         ...
1164       69965                           1
1165       69966                           1
1166       69968                           1
1167       69977                           1
1168       69978                           1

[1048 rows x 2 columns]

Total Parked Vehicles by Kerbside ID Across the Dataset:
      kerbsideid  total_parked_vehicles
0           5736                      1
918        57316                      1
926        58119                      1
925        58118                      1
924        58117                      1
...          ...                    ...
459        20576                      1
458        20575                      1
457        20574                      1
456        20573                      1
1380       69978                      1

[1381 rows x 2 columns]

15. SQL Query Based Operations¶

15.1. Create SQLite database and tables (No Relationship Assignment to the Datasets)¶

This code combines two parking datasets from Melbourne’s open data. The first dataset lists parking zones and restrictions, while the second shows real-time parking sensor data. Any missing values in both datasets are replaced with default placeholders like "Unknown" or default times like "00:00" to ensure the data is clean.

The code stores the datasets in a temporary SQLite database, allowing us to run queries. Three example queries are shown: (1) retrieving parking zone restrictions, (2) listing unoccupied parking bays, and (3) combining parking zone restrictions with real-time data. This setup makes it easier to explore and analyze how parking restrictions relate to real-time availability.

By cleaning and structuring the data, this approach provides a clear way to manage and query parking information for better decision-making or further analysis.

In [4]:
import requests
import pandas as pd
import sqlite3
from io import StringIO

# API details for the first dataset: 'sign-plates-located-in-each-parking-zone-copy'
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

# API details for the second dataset: 'on-street-parking-bay-sensors'
base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch datasets
response_1 = requests.get(url_1)
df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')

response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Fill null values in df_1
df_1.fillna({
    'parkingzone': 'Unknown',  # Replace null parking zones with 'Unknown'
    'restriction_days': 'No Restrictions',  # Replace null restriction days with 'No Restrictions'
    'time_restrictions_start': '00:00',  # Default to midnight for missing time start
    'time_restrictions_finish': '23:59',  # Default to end of day for missing time finish
    'restriction_display': 'No Display'  # Replace null restriction display with 'No Display'
}, inplace=True)

# Fill null values in df_2
df_2.fillna({
    'lastupdated': '1970-01-01T00:00:00',  # Replace null timestamps with a default epoch time
    'status_timestamp': '1970-01-01T00:00:00',  # Replace null status timestamps
    'zone_number': 'Unknown',  # Replace null zone numbers with 'Unknown'
    'status_description': 'Unknown',  # Replace null status descriptions with 'Unknown'
    'kerbsideid': 'Unknown',  # Replace null kerbside IDs with 'Unknown'
    'location': 'Unknown'  # Replace null locations with 'Unknown'
}, inplace=True)

# Create SQLite database and tables
conn = sqlite3.connect(':memory:')
df_1.to_sql('sign_plates_located_in_each_parking_zone', conn, index=False, if_exists='replace')
df_2.to_sql('on_street_parking_bay_sensors', conn, index=False, if_exists='replace')

# Define a function to execute and display SQL queries with explanations
def execute_query_with_explanation(title, explanation, query):
    print(f"\n### {title} ###")
    print(f"{explanation}\n")
    result = pd.read_sql_query(query, conn)
    print(result)
    return result

# Example queries after handling null values
execute_query_with_explanation(
    "Retrieve Parking Zones and Restrictions",
    "This query retrieves parking zones and their restriction details from the sign plates dataset.",
    """
    SELECT parkingzone, restriction_days, time_restrictions_start, time_restrictions_finish
    FROM sign_plates_located_in_each_parking_zone;
    """
)

execute_query_with_explanation(
    "Filter Unoccupied Parking Bays",
    "This query filters out parking sensor data to show unoccupied parking bays with their zone numbers.",
    """
    SELECT kerbsideid, status_description, zone_number
    FROM on_street_parking_bay_sensors
    WHERE status_description = 'Unoccupied';
    """
)

execute_query_with_explanation(
    "Combine Parking Zone Restrictions and Real-Time Status",
    "This query joins both datasets to match parking zone restrictions with the real-time parking status and location.",
    """
    SELECT 
        s1.parkingzone, 
        s1.restriction_days, 
        s2.status_description, 
        s2.location
    FROM sign_plates_located_in_each_parking_zone AS s1
    JOIN on_street_parking_bay_sensors AS s2
    ON s1.parkingzone = s2.zone_number;
    """
)

# Close the SQLite connection
conn.close()
### Retrieve Parking Zones and Restrictions ###
This query retrieves parking zones and their restriction details from the sign plates dataset.

      parkingzone restriction_days time_restrictions_start  \
0            7445          Mon-Fri                16:00:00   
1            7446          Mon-Fri                16:00:00   
2            7449          Mon-Sat                07:30:00   
3            7450          Sat-Sun                07:00:00   
4            7452          Mon-Fri                16:00:00   
...           ...              ...                     ...   
1153         7433              Sat                07:30:00   
1154         7434              Sat                18:30:00   
1155         7436          Mon-Sun                07:00:00   
1156         7440          Mon-Sat                07:30:00   
1157         7441              Sat                07:30:00   

     time_restrictions_finish  
0                    20:30:00  
1                    22:00:00  
2                    20:30:00  
3                    22:00:00  
4                    22:00:00  
...                       ...  
1153                 20:30:00  
1154                 20:30:00  
1155                 22:00:00  
1156                 18:30:00  
1157                 20:30:00  

[1158 rows x 4 columns]

### Filter Unoccupied Parking Bays ###
This query filters out parking sensor data to show unoccupied parking bays with their zone numbers.

      kerbsideid status_description zone_number
0          50663         Unoccupied      7649.0
1          50664         Unoccupied      7649.0
2          50634         Unoccupied      7649.0
3          50635         Unoccupied      7649.0
4          50640         Unoccupied      7649.0
...          ...                ...         ...
1782       63311         Unoccupied      7506.0
1783       67428         Unoccupied      7948.0
1784       53227         Unoccupied     Unknown
1785       53228         Unoccupied     Unknown
1786       53226         Unoccupied      7379.0

[1787 rows x 3 columns]

### Combine Parking Zone Restrictions and Real-Time Status ###
This query joins both datasets to match parking zone restrictions with the real-time parking status and location.

      parkingzone restriction_days status_description  \
0            7649          Mon-Sat         Unoccupied   
1            7649          Mon-Sat         Unoccupied   
2            7649          Mon-Sat         Unoccupied   
3            7649          Mon-Sat         Unoccupied   
4            7649          Mon-Sat         Unoccupied   
...           ...              ...                ...   
4560         7379          Mon-Sat            Present   
4561         7603          Mon-Fri            Present   
4562         7603          Mon-Fri            Present   
4563         7603              Sat            Present   
4564         7603              Sat            Present   

                                     location  
0      -37.80908828360667, 144.97187134487461  
1      -37.80908828360667, 144.97187134487461  
2     -37.809037522981974, 144.97184785392136  
3     -37.809037522981974, 144.97184785392136  
4      -37.80882551342851, 144.97187528239476  
...                                       ...  
4560  -37.812934000783684, 144.96245238315606  
4561  -37.812063040805526, 144.96267921897072  
4562  -37.812063040805526, 144.96267921897072  
4563  -37.812063040805526, 144.96267921897072  
4564  -37.812063040805526, 144.96267921897072  

[4565 rows x 4 columns]

15.2. SQL + Spatio-Temporal Clustering¶

Spatio-temporal clustering is a data mining technique used to analyze datasets that contain both spatial (location-based) and temporal (time-based) information. It identifies patterns and groups (clusters) within these datasets by considering both location and time dimensions.

This code combines Melbourne parking zone and sensor information to find the pattern for vacant spots using clustering. Fill in missing values in the datasets with their default placeholders after fetching data from APIs; join data based on parking zone, filtering only unoccupied bays. Extract latitude and longitude from location data so that spatial analysis can be done. The cleaned dataset is then standardized, and DBSCAN clustering is applied to group similar parking zones by geographic location and status. Noise points are the clusters labeled as -1, showing outliers or areas that don't fit into the group. On a Melbourne map using Folium, the results were visualized, highlighting the clusters and noise. In addition, a 2D scatter plot provides a quick view of how parking zones are distributed spatially. Clustering helps in locating areas prone to parking availability problems; and provides insights in urban planning.

In [2]:
import requests
import pandas as pd
import sqlite3
from io import StringIO
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
import folium
import matplotlib.pyplot as plt

# Fetch the datasets from the provided APIs
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch the datasets
response_1 = requests.get(url_1)
df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')

response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Fill null values in both datasets
df_1.fillna({
    'parkingzone': 'Unknown',
    'restriction_days': 'No Restrictions',
    'time_restrictions_start': '00:00',
    'time_restrictions_finish': '23:59',
    'restriction_display': 'No Display'
}, inplace=True)

df_2.fillna({
    'lastupdated': '1970-01-01T00:00:00',
    'status_timestamp': '1970-01-01T00:00:00',
    'zone_number': 'Unknown',
    'status_description': 'Unknown',
    'kerbsideid': 'Unknown',
    'location': 'Unknown'
}, inplace=True)

# Create an SQLite database
conn = sqlite3.connect(':memory:')
df_1.to_sql('sign_plates_located_in_each_parking_zone', conn, index=False, if_exists='replace')
df_2.to_sql('on_street_parking_bay_sensors', conn, index=False, if_exists='replace')

# SQL query to preprocess and combine data
query = """
SELECT 
    s1.parkingzone, 
    s1.restriction_days, 
    s2.status_description, 
    s2.location
FROM sign_plates_located_in_each_parking_zone AS s1
JOIN on_street_parking_bay_sensors AS s2
ON s1.parkingzone = s2.zone_number
WHERE s2.status_description = 'Unoccupied';
"""

# Execute the query and fetch the preprocessed data
preprocessed_data = pd.read_sql_query(query, conn)

# Debugging: Check the shape of the SQL query output
print("Shape of data after SQL query:", preprocessed_data.shape)
if preprocessed_data.empty:
    print("No data returned by the SQL query. Check the filtering conditions.")
    exit()

# Debugging: Check unique values in the 'location' column
print("Unique values in 'location':")
print(preprocessed_data['location'].unique()[:10])  # Print a sample of unique location values

# Split latitude and longitude from the 'location' column
preprocessed_data[['Latitude', 'Longitude']] = preprocessed_data['location'].str.split(',', expand=True).astype(float)

# Debugging: Check the validity of latitude and longitude
print("Shape before dropping rows with missing Latitude/Longitude:", preprocessed_data.shape)
preprocessed_data.dropna(subset=['Latitude', 'Longitude'], inplace=True)
print("Shape after dropping rows with missing Latitude/Longitude:", preprocessed_data.shape)

# Prepare the data for clustering
clustering_data = preprocessed_data[['Latitude', 'Longitude', 'status_description']].copy()
clustering_data['status_description_encoded'] = clustering_data['status_description'].astype('category').cat.codes

# Debugging: Check for empty dataframe
print("Shape of clustering data before standardization:", clustering_data.shape)
if clustering_data.empty:
    print("No valid data for clustering. Check the preprocessing steps.")
    exit()

# Standardize the features for clustering
scaler = StandardScaler()
clustering_features = scaler.fit_transform(clustering_data[['Latitude', 'Longitude', 'status_description_encoded']])

# Apply DBSCAN clustering
dbscan = DBSCAN(eps=0.5, min_samples=5)  # Tune parameters for better clustering
clustering_data['cluster'] = dbscan.fit_predict(clustering_features)

# Debugging: Check the clustering results
print("Cluster labels distribution:", clustering_data['cluster'].value_counts())

# Visualize clusters on a map
melbourne_map = folium.Map(location=[-37.8136, 144.9631], zoom_start=13)
for _, row in clustering_data.iterrows():
    color = 'red' if row['cluster'] == -1 else 'blue'  # Noise points in red
    folium.CircleMarker(
        location=(row['Latitude'], row['Longitude']),
        radius=5,
        color=color,
        fill=True,
        fill_opacity=0.6
    ).add_to(melbourne_map)

# Save the map to an HTML file
melbourne_map.save('spatio_temporal_clustering_fixed.html')

# Plot the clusters for visualization (2D scatter plot)
plt.figure(figsize=(10, 8))
plt.scatter(
    clustering_data['Longitude'], 
    clustering_data['Latitude'], 
    c=clustering_data['cluster'], 
    cmap='rainbow', 
    s=10
)
plt.title('Spatio-Temporal Clustering of Parking Zones')
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.colorbar(label='Cluster ID')
plt.show()
Shape of data after SQL query: (2385, 4)
Unique values in 'location':
['-37.80908828360667, 144.97187134487461'
 '-37.809037522981974, 144.97184785392136'
 '-37.80882551342851, 144.97187528239476'
 '-37.808660179978915, 144.97179932080303'
 '-37.808589373656346, 144.97176686270228'
 '-37.810334301158015, 144.96891216705563'
 '-37.813517379359894, 144.95802880213256'
 '-37.81341256173804, 144.95838767338887'
 '-37.813320247143366, 144.9587044311516'
 '-37.813311556984594, 144.95873418423957']
Shape before dropping rows with missing Latitude/Longitude: (2385, 6)
Shape after dropping rows with missing Latitude/Longitude: (2385, 6)
Shape of clustering data before standardization: (2385, 4)
Cluster labels distribution: cluster
0    2323
1      30
2      23
3       9
Name: count, dtype: int64
No description has been provided for this image

15.3. Merge the Dataset Columns using for SQL Queries¶

It fetches two open data portal datasets of Melbourne and pre-processes parking zone restrictions and on-street parking bay sensors. Via requests, it fetches each of the datasets in CSV format; checks for a successful response to assure proper consistency of data, filling default values for missing ones, normalizes key columns by converting to lowercase and stripping whitespaces to allow merging correctly. Overlaps between parkingzone and zone_number are detected, and the datasets are joined on an inner join. Debugging outputs dataset shapes, unique values, and matches. If merged successfully, the data is saved as merged_parking_data.csv, providing a clean dataset for further analysis.

In [6]:
import requests
import pandas as pd
from io import StringIO

# Fetch the datasets from the provided APIs
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch the datasets
response_1 = requests.get(url_1)
if response_1.status_code == 200:
    df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')
else:
    print("Failed to fetch dataset 1")
    exit()

response_2 = requests.get(url_2)
if response_2.status_code == 200:
    df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')
else:
    print("Failed to fetch dataset 2")
    exit()

# Fill null values in both datasets
df_1.fillna({
    'parkingzone': 'Unknown',
    'restriction_days': 'No Restrictions',
    'time_restrictions_start': '00:00',
    'time_restrictions_finish': '23:59',
    'restriction_display': 'No Display'
}, inplace=True)

df_2.fillna({
    'lastupdated': '1970-01-01T00:00:00',
    'status_timestamp': '1970-01-01T00:00:00',
    'zone_number': 'Unknown',
    'status_description': 'Unknown',
    'kerbsideid': 'Unknown',
    'location': 'Unknown'
}, inplace=True)

# Debugging: Print the shapes of both datasets
print("Shape of Dataset 1:", df_1.shape)
print("Shape of Dataset 2:", df_2.shape)

# Inspect unique values before standardization
print("Unique parking zones in Dataset 1 before cleaning:")
print(df_1['parkingzone'].unique()[:20])

print("Unique zone numbers in Dataset 2 before cleaning:")
print(df_2['zone_number'].unique()[:20])

# Convert columns to strings explicitly before applying string operations
df_1['parkingzone'] = df_1['parkingzone'].astype(str)
df_2['zone_number'] = df_2['zone_number'].astype(str)

# Standardize the formats of the columns used for merging
df_1['parkingzone'] = df_1['parkingzone'].str.strip().str.lower()
df_2['zone_number'] = df_2['zone_number'].str.strip().str.lower()

# Check overlap between the two columns
matching_zones = set(df_1['parkingzone']).intersection(set(df_2['zone_number']))
print("Matching Zones:", matching_zones)
print("Number of Matching Zones:", len(matching_zones))

# Merge the datasets after standardization
merged_data = pd.merge(
    df_1,
    df_2,
    left_on='parkingzone',
    right_on='zone_number',
    how='inner'
)

# Display results of the merge
print("Merged Data Shape:", merged_data.shape)
if not merged_data.empty:
    print("Sample of merged data:")
    print(merged_data.head())
else:
    print("No matching data found after merging.")

# Save merged data to a CSV file if it's not empty
if not merged_data.empty:
    merged_data.to_csv('merged_parking_data.csv', index=False)
    print("Merged data saved as 'merged_parking_data.csv'")
else:
    print("No data to save after merging.")
Shape of Dataset 1: (1158, 5)
Shape of Dataset 2: (3296, 6)
Unique parking zones in Dataset 1 before cleaning:
[7445 7446 7449 7450 7452 7454 7471 7476 7479 7486 7487 7497 7500 7498
 7501 7508 7514 7520 7528 7529]
Unique zone numbers in Dataset 2 before cleaning:
['Unknown' 7649.0 7556.0 7767.0 7768.0 7566.0 7633.0 7634.0 7218.0 7498.0
 7949.0 7552.0 7547.0 7948.0 7612.0 7438.0 7638.0 7557.0 7548.0 7561.0]
Matching Zones: set()
Number of Matching Zones: 0
Merged Data Shape: (0, 11)
No matching data found after merging.
No data to save after merging.

15.4. Create Connections between 2 datasets with Assigning Foreign Key¶

This script downloads two sets of data from the Melbourne Open Data API: one relating to parking zones, and one relating to onstreet parking sensors. It reads in the data, filling in defaults for missing values in critical columns post-download. It then cleans the datasets such that the types of parkingzone and zone_number are consistent, and foreign key relationships can be established. Data is stored in an in-memory SQLite database, with a foreign key constraint linking zone_number to parkingzone. Finally, an SQL query joins the datasets to find unoccupied parking zones along with their restrictions and location details, presenting the results in a structured format using pandas.

In [8]:
import requests
import pandas as pd
import sqlite3
from io import StringIO

# Fetch the datasets from the provided APIs
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch the datasets
response_1 = requests.get(url_1)
if response_1.status_code == 200:
    df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')
else:
    print("Failed to fetch dataset 1")
    exit()

response_2 = requests.get(url_2)
if response_2.status_code == 200:
    df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')
else:
    print("Failed to fetch dataset 2")
    exit()

# Fill null values in both datasets
df_1.fillna({
    'parkingzone': 'Unknown',
    'restriction_days': 'No Restrictions',
    'time_restrictions_start': '00:00',
    'time_restrictions_finish': '23:59',
    'restriction_display': 'No Display'
}, inplace=True)

df_2.fillna({
    'lastupdated': '1970-01-01T00:00:00',
    'status_timestamp': '1970-01-01T00:00:00',
    'zone_number': 'Unknown',
    'status_description': 'Unknown',
    'kerbsideid': 'Unknown',
    'location': 'Unknown'
}, inplace=True)

# Ensure both datasets have the same type for foreign key assignment
df_1['parkingzone'] = df_1['parkingzone'].astype(str)
df_2['zone_number'] = df_2['zone_number'].astype(str)

# Create an SQLite database in memory
conn = sqlite3.connect(':memory:')

# Write datasets to SQLite tables
df_1.to_sql('sign_plates', conn, index=False, if_exists='replace')
df_2.to_sql('parking_sensors', conn, index=False, if_exists='replace')

# Add foreign key constraint
with conn:
    conn.execute("""
    CREATE TABLE linked_sign_plates AS
    SELECT * FROM sign_plates
    """)
    conn.execute("""
    CREATE TABLE linked_parking_sensors AS
    SELECT * FROM parking_sensors
    """)
    # Create the table with the foreign key constraint
    conn.execute("DROP TABLE IF EXISTS parking_sensors_with_fk")
    conn.execute("""
    CREATE TABLE parking_sensors_with_fk (
        lastupdated TEXT,
        status_timestamp TEXT,
        zone_number TEXT,
        status_description TEXT,
        kerbsideid TEXT,
        location TEXT,
        FOREIGN KEY (zone_number) REFERENCES sign_plates(parkingzone)
    )
    """)
    # Populate the new table
    conn.execute("""
    INSERT INTO parking_sensors_with_fk (lastupdated, status_timestamp, zone_number, status_description, kerbsideid, location)
    SELECT lastupdated, status_timestamp, zone_number, status_description, kerbsideid, location
    FROM parking_sensors
    """)

# Execute an SQL query joining the tables
query = """
SELECT 
    sp.parkingzone, 
    sp.restriction_days, 
    sp.time_restrictions_start, 
    sp.time_restrictions_finish, 
    ps.lastupdated, 
    ps.location, 
    ps.kerbsideid 
FROM sign_plates sp
INNER JOIN parking_sensors_with_fk ps
ON sp.parkingzone = ps.zone_number
WHERE ps.status_description = 'Unoccupied';
"""

result = pd.read_sql_query(query, conn)

# Display the query result
print("Query Result:")
print(result.head())

# Close the connection
conn.close()
Query Result:
Empty DataFrame
Columns: [parkingzone, restriction_days, time_restrictions_start, time_restrictions_finish, lastupdated, location, kerbsideid]
Index: []

15.5. SQL QUERIES with data relationships - foreign key defined - Non indexing- Performance Analysis for no relation and relational data¶

In the provided code, the foreign key relationship is established between the following columns:

Primary & Foreign Key Assignment

Primary Key Column in sign_plates dataset: parkingzone: This column uniquely identifies parking zones in the sign_plates table.

Foreign Key Column in parking_sensors_with_fk dataset: zone_number: This column references the parking zones in the parking_sensors table.

Why These Columns? The parkingzone column in the sign_plates dataset contains identifiers for parking zones and serves as a primary key in its context. The zone_number column in the parking_sensors dataset contains the same type of data and is used to associate parking bay sensor information with parking zone restrictions.

In [9]:
import requests
import pandas as pd
import sqlite3
from io import StringIO
import time

# Fetch the datasets from the provided APIs
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch the datasets
response_1 = requests.get(url_1)
df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';') if response_1.status_code == 200 else exit("Dataset 1 fetch failed")
response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';') if response_2.status_code == 200 else exit("Dataset 2 fetch failed")

# Fill null values in both datasets
df_1.fillna({
    'parkingzone': 'Unknown',
    'restriction_days': 'No Restrictions',
    'time_restrictions_start': '00:00',
    'time_restrictions_finish': '23:59',
    'restriction_display': 'No Display'
}, inplace=True)

df_2.fillna({
    'lastupdated': '1970-01-01T00:00:00',
    'status_timestamp': '1970-01-01T00:00:00',
    'zone_number': 'Unknown',
    'status_description': 'Unknown',
    'kerbsideid': 'Unknown',
    'location': 'Unknown'
}, inplace=True)

# Ensure both datasets have the same type for foreign key assignment
df_1['parkingzone'] = df_1['parkingzone'].astype(str)
df_2['zone_number'] = df_2['zone_number'].astype(str)

# Create an SQLite database in memory
conn_fk = sqlite3.connect(':memory:')  # For foreign key-enabled query
conn_no_fk = sqlite3.connect(':memory:')  # For no foreign key

# Write datasets to both SQLite databases
df_1.to_sql('sign_plates', conn_fk, index=False, if_exists='replace')
df_2.to_sql('parking_sensors', conn_fk, index=False, if_exists='replace')
df_1.to_sql('sign_plates', conn_no_fk, index=False, if_exists='replace')
df_2.to_sql('parking_sensors', conn_no_fk, index=False, if_exists='replace')

# Add foreign key constraint in the first database
with conn_fk:
    conn_fk.execute("""
    CREATE TABLE parking_sensors_with_fk (
        lastupdated TEXT,
        status_timestamp TEXT,
        zone_number TEXT,
        status_description TEXT,
        kerbsideid TEXT,
        location TEXT,
        FOREIGN KEY (zone_number) REFERENCES sign_plates(parkingzone)
    )
    """)
    conn_fk.execute("""
    INSERT INTO parking_sensors_with_fk (lastupdated, status_timestamp, zone_number, status_description, kerbsideid, location)
    SELECT lastupdated, status_timestamp, zone_number, status_description, kerbsideid, location
    FROM parking_sensors
    """)

# Define the SQL query
query = """
SELECT 
    sp.parkingzone, 
    sp.restriction_days, 
    sp.time_restrictions_start, 
    sp.time_restrictions_finish, 
    ps.lastupdated, 
    ps.location, 
    ps.kerbsideid 
FROM sign_plates sp
INNER JOIN parking_sensors_with_fk ps
ON sp.parkingzone = ps.zone_number
WHERE ps.status_description = 'Unoccupied';
"""

# Measure query time with foreign key
start_time_fk = time.time()
result_fk = pd.read_sql_query(query, conn_fk)
end_time_fk = time.time()
time_with_fk = end_time_fk - start_time_fk

# Measure query time without foreign key
query_no_fk = """
SELECT 
    sp.parkingzone, 
    sp.restriction_days, 
    sp.time_restrictions_start, 
    sp.time_restrictions_finish, 
    ps.lastupdated, 
    ps.location, 
    ps.kerbsideid 
FROM sign_plates sp
INNER JOIN parking_sensors ps
ON sp.parkingzone = ps.zone_number
WHERE ps.status_description = 'Unoccupied';
"""
start_time_no_fk = time.time()
result_no_fk = pd.read_sql_query(query_no_fk, conn_no_fk)
end_time_no_fk = time.time()
time_without_fk = end_time_no_fk - start_time_no_fk

# Display performance results
print("Query Time with Foreign Key:", time_with_fk, "seconds")
print("Query Time without Foreign Key:", time_without_fk, "seconds")

# Display results
print("Results with Foreign Key:")
print(result_fk.head())

print("Results without Foreign Key:")
print(result_no_fk.head())

# Close database connections
conn_fk.close()
conn_no_fk.close()
Query Time with Foreign Key: 0.0 seconds
Query Time without Foreign Key: 0.0 seconds
Results with Foreign Key:
Empty DataFrame
Columns: [parkingzone, restriction_days, time_restrictions_start, time_restrictions_finish, lastupdated, location, kerbsideid]
Index: []
Results without Foreign Key:
Empty DataFrame
Columns: [parkingzone, restriction_days, time_restrictions_start, time_restrictions_finish, lastupdated, location, kerbsideid]
Index: []

15.6. SQL QUERIES with data relationships - foreign key defined - Indexing - Performance Analysis for no relation and relational data¶

This script, in Python, makes a request from open data APIs in Melbourne for car parking-related datasets to enable processing for analysis. This script uses the requests library to download CSV files and the pandas library for cleaning and preprocessing the data. Import datasets into two in-memory SQLite databases, one that allows foreign keys and one without. A schema, foreign key constraints, are created in order to establish relations between tables. Indexes are then added to make queries more efficient. An SQL script runs and time queries against the two scenarios. This shows that querying is indeed more efficient sometimes, based on the different performances due to foreign keys or indexing.

In [10]:
import requests
import pandas as pd
import sqlite3
from io import StringIO
import time

# Fetch the datasets from the provided APIs
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch the datasets
response_1 = requests.get(url_1)
df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';') if response_1.status_code == 200 else exit("Dataset 1 fetch failed")
response_2 = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';') if response_2.status_code == 200 else exit("Dataset 2 fetch failed")

# Fill null values in both datasets
df_1.fillna({
    'parkingzone': 'Unknown',
    'restriction_days': 'No Restrictions',
    'time_restrictions_start': '00:00',
    'time_restrictions_finish': '23:59',
    'restriction_display': 'No Display'
}, inplace=True)

df_2.fillna({
    'lastupdated': '1970-01-01T00:00:00',
    'status_timestamp': '1970-01-01T00:00:00',
    'zone_number': 'Unknown',
    'status_description': 'Unknown',
    'kerbsideid': 'Unknown',
    'location': 'Unknown'
}, inplace=True)

# Ensure both datasets have the same type for foreign key assignment
df_1['parkingzone'] = df_1['parkingzone'].astype(str)
df_2['zone_number'] = df_2['zone_number'].astype(str)

# Create an SQLite database in memory
conn_fk = sqlite3.connect(':memory:')  # For foreign key-enabled query
conn_no_fk = sqlite3.connect(':memory:')  # For no foreign key

# Write datasets to both SQLite databases
df_1.to_sql('sign_plates', conn_fk, index=False, if_exists='replace')
df_2.to_sql('parking_sensors', conn_fk, index=False, if_exists='replace')
df_1.to_sql('sign_plates', conn_no_fk, index=False, if_exists='replace')
df_2.to_sql('parking_sensors', conn_no_fk, index=False, if_exists='replace')

# Add foreign key constraint in the first database
with conn_fk:
    conn_fk.execute("""
    CREATE TABLE parking_sensors_with_fk (
        lastupdated TEXT,
        status_timestamp TEXT,
        zone_number TEXT,
        status_description TEXT,
        kerbsideid TEXT,
        location TEXT,
        FOREIGN KEY (zone_number) REFERENCES sign_plates(parkingzone)
    )
    """)
    conn_fk.execute("""
    INSERT INTO parking_sensors_with_fk (lastupdated, status_timestamp, zone_number, status_description, kerbsideid, location)
    SELECT lastupdated, status_timestamp, zone_number, status_description, kerbsideid, location
    FROM parking_sensors
    """)

    # Add indexes to foreign key and primary key columns
    conn_fk.execute("CREATE INDEX idx_parkingzone ON sign_plates(parkingzone);")
    conn_fk.execute("CREATE INDEX idx_zone_number ON parking_sensors_with_fk(zone_number);")

# Add indexing for the non-foreign key setup
with conn_no_fk:
    conn_no_fk.execute("CREATE INDEX idx_parkingzone_no_fk ON sign_plates(parkingzone);")
    conn_no_fk.execute("CREATE INDEX idx_zone_number_no_fk ON parking_sensors(zone_number);")

# Define the SQL query
query = """
SELECT 
    sp.parkingzone, 
    sp.restriction_days, 
    sp.time_restrictions_start, 
    sp.time_restrictions_finish, 
    ps.lastupdated, 
    ps.location, 
    ps.kerbsideid 
FROM sign_plates sp
INNER JOIN parking_sensors_with_fk ps
ON sp.parkingzone = ps.zone_number
WHERE ps.status_description = 'Unoccupied';
"""

# Measure query time with foreign key
start_time_fk = time.time()
result_fk = pd.read_sql_query(query, conn_fk)
end_time_fk = time.time()
time_with_fk = end_time_fk - start_time_fk

# Measure query time without foreign key
query_no_fk = """
SELECT 
    sp.parkingzone, 
    sp.restriction_days, 
    sp.time_restrictions_start, 
    sp.time_restrictions_finish, 
    ps.lastupdated, 
    ps.location, 
    ps.kerbsideid 
FROM sign_plates sp
INNER JOIN parking_sensors ps
ON sp.parkingzone = ps.zone_number
WHERE ps.status_description = 'Unoccupied';
"""
start_time_no_fk = time.time()
result_no_fk = pd.read_sql_query(query_no_fk, conn_no_fk)
end_time_no_fk = time.time()
time_without_fk = end_time_no_fk - start_time_no_fk

# Display performance results
print("Query Time with Foreign Key and Indexing:", time_with_fk, "seconds")
print("Query Time without Foreign Key but with Indexing:", time_without_fk, "seconds")

# Display results
print("Results with Foreign Key:")
print(result_fk.head())

print("Results without Foreign Key:")
print(result_no_fk.head())

# Close database connections
conn_fk.close()
conn_no_fk.close()
Query Time with Foreign Key and Indexing: 0.016555070877075195 seconds
Query Time without Foreign Key but with Indexing: 0.0 seconds
Results with Foreign Key:
Empty DataFrame
Columns: [parkingzone, restriction_days, time_restrictions_start, time_restrictions_finish, lastupdated, location, kerbsideid]
Index: []
Results without Foreign Key:
Empty DataFrame
Columns: [parkingzone, restriction_days, time_restrictions_start, time_restrictions_finish, lastupdated, location, kerbsideid]
Index: []

Observations Query Times:

With Foreign Key and Indexing: The query took approximately 0.0166 seconds. Without Foreign Key but With Indexing: The query was instantaneous (0.0 seconds). Minimal Performance Difference: The small difference suggests the datasets are likely small or the indexing efficiency outweighs the foreign key overhead.

What is indexing?

Indexing in database modeling is like creating a quick reference guide for the database to find information faster. It helps the database locate rows in a table without scanning the entire table, improving query performance. Think of it as a book's index that lets you jump to a specific topic instead of reading every page.

16. SQLAlchemy(SQL Toolkit) 2.0 standards:¶

Extract Relevant Columns
Prepare Data and Rename Columns Create SQL Tables and Add Indexing Filter Data (WHERE Clause) Combine Tables (JOIN Clause) Classify User Types (CASE Statement) Rank Results (ORDER BY) Common Table Expressions (CTE) Analytical Functions

This Python script retrieves two parking-related datasets from Melbourne's open data APIs, processes them using pandas, and stores them in an in-memory SQLite database for analysis. The data is cleaned and standardized with renamed columns. SQL tables are created for the datasets, and indexing is applied for performance optimization. The script runs a variety of SQL queries including simple data extraction, filtering with WHERE, joining tables, classifying zones based on usage (CASE), ranking (ORDER BY), and using advanced SQL features like Common Table Expressions (CTEs) and analytical functions (ROW_NUMBER, RANK, LAG). Results highlight insights into parking usage patterns.

In [2]:
import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy.sql import text
from io import StringIO
import requests

# -------------------------------
# 1. Fetch Datasets from APIs
# -------------------------------
# API URLs
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch datasets
response_1 = requests.get(url_1)
response_2 = requests.get(url_2)

if response_1.status_code == 200 and response_2.status_code == 200:
    # Read datasets into DataFrames
    df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')
    df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')
else:
    exit("Failed to fetch datasets.")

print("Datasets fetched successfully.")

# -------------------------------
# 2. Prepare Data and Rename Columns
# -------------------------------
# Rename columns for consistency
df_1.columns = ['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']
df_2.columns = ['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']

print("Datasets prepared with proper column names.")

# -------------------------------
# 3. Create SQL Tables and Add Indexing
# -------------------------------
# Create an in-memory SQLite database
engine = create_engine('sqlite:///:memory:')

# Save DataFrames as SQL tables
df_1.to_sql('sign_plates', engine, index=False, if_exists='replace')
df_2.to_sql('parking_bay_sensors', engine, index=False, if_exists='replace')

# Add indexes for performance optimization
with engine.connect() as conn:
    conn.execute(text("CREATE INDEX idx_parkingzone ON sign_plates (parkingzone);"))
    conn.execute(text("CREATE INDEX idx_zone_number ON parking_bay_sensors (zone_number);"))

print("SQL tables created and indexes added.")

# -------------------------------
# 4. Run SQL Queries and Print Results
# -------------------------------
# Query 1: Extract Relevant Columns
query_1 = """
    SELECT parkingzone, restriction_days, restriction_display
    FROM sign_plates;
"""

# Query 2: Filter Data (WHERE Clause)
query_2 = """
    SELECT zone_number, COUNT(*) AS total_parked
    FROM parking_bay_sensors
    WHERE status_description = 'Occupied'
    GROUP BY zone_number;
"""

# Query 3: Combine Tables (JOIN Clause)
query_3 = """
    SELECT pb.zone_number, sp.parkingzone, COUNT(pb.status_description) AS total_parked
    FROM parking_bay_sensors pb
    JOIN sign_plates sp
    ON pb.zone_number = sp.parkingzone
    WHERE pb.status_description = 'Occupied'
    GROUP BY pb.zone_number, sp.parkingzone;
"""

# Query 4: Classify User Types (CASE Statement)
query_4 = """
    SELECT zone_number,
           CASE
               WHEN COUNT(*) > 100 THEN 'High Utilization'
               ELSE 'Low Utilization'
           END AS utilization_category
    FROM parking_bay_sensors
    GROUP BY zone_number;
"""

# Query 5: Rank Results (ORDER BY)
query_5 = """
    SELECT zone_number, COUNT(*) AS total_parked
    FROM parking_bay_sensors
    WHERE status_description = 'Occupied'
    GROUP BY zone_number
    ORDER BY total_parked DESC
    LIMIT 10;
"""

# Query 6: Common Table Expressions (CTE)
query_6 = """
    WITH PeakUsage AS (
        SELECT zone_number, COUNT(*) AS total_parked
        FROM parking_bay_sensors
        WHERE status_description = 'Occupied'
        GROUP BY zone_number
    )
    SELECT * FROM PeakUsage WHERE total_parked > 50;
"""

# Query 7: Analytical Functions
query_7 = """
    SELECT zone_number,
           status_timestamp,
           status_description,
           ROW_NUMBER() OVER (PARTITION BY zone_number ORDER BY status_timestamp) AS row_num,
           RANK() OVER (PARTITION BY zone_number ORDER BY status_timestamp DESC) AS rank,
           LAG(status_description) OVER (PARTITION BY zone_number ORDER BY status_timestamp) AS prev_status
    FROM parking_bay_sensors;
"""

# Execute and print results
queries = [query_1, query_2, query_3, query_4, query_5, query_6, query_7]
titles = [
    "Query 1: Extract Relevant Columns",
    "Query 2: Filter Data (WHERE Clause)",
    "Query 3: Combine Tables (JOIN Clause)",
    "Query 4: Classify User Types (CASE Statement)",
    "Query 5: Rank Results (ORDER BY)",
    "Query 6: Common Table Expressions (CTE)",
    "Query 7: Analytical Functions"
]

with engine.connect() as conn:
    for title, query in zip(titles, queries):
        print(f"\n{title}")
        result = conn.execute(text(query))
        for row in result:
            print(row)
Datasets fetched successfully.
Datasets prepared with proper column names.
SQL tables created and indexes added.

Query 1: Extract Relevant Columns
(7445, 'Mon-Fri', '2P')
(7446, 'Mon-Fri', '2P')
(7449, 'Mon-Sat', '2P')
(7450, 'Sat-Sun', '2P')
(7452, 'Mon-Fri', '2P')
(7452, 'Sat-Sun', '2P')
(7454, 'Sat-Sun', '2P')
(7471, 'Sat', '2P')
(7476, 'Mon-Fri', '1P')
(7479, 'Sat', '2P')
(7486, 'Mon-Fri', '1P')
(7486, 'Sat', '1P')
(7487, 'Sat', '1P')
(7487, 'Sat', '2P')
(7497, 'Mon-Sat', '2P')
(7500, 'Mon-Sat', '2P')
(7498, 'Mon-Sat', 'HP')
(7498, 'Mon-Sat', '2P')
(7501, 'Mon-Sat', '2P')
(7508, 'Mon-Fri', '2P')
(7514, 'Sat', '2P')
(7520, 'Mon-Fri', '1P')
(7528, 'Mon-Sat', '1P')
(7529, 'Mon-Fri', '2P')
(7532, 'Mon-Sat', 'HP')
(7532, 'Mon-Sat', '2P')
(7533, 'Mon-Sun', '2P')
(7537, 'Sat', '2P')
(7539, 'Mon-Sat', '2P')
(7543, 'Mon-Sat', '2P')
(7541, 'Mon-Sat', '3P')
(7544, 'Sat', '2P')
(7546, 'Mon-Fri', '2P')
(7548, 'Mon-Fri', '3P')
(7549, 'Mon-Fri', '2P')
(7551, 'Sat', '2P')
(7554, 'Mon-Sat', '2P')
(7556, 'Mon-Sat', '2P')
(7553, 'Sat', '2P')
(7557, 'Mon-Fri', '1P')
(7557, 'Sat', '2P')
(7558, 'Mon-Fri', '1P')
(7558, 'Sat', '2P')
(7562, 'Mon-Fri', '1P')
(7562, 'Sat', '1P')
(7567, 'Mon-Fri', '2P')
(7568, 'Mon-Fri', '1P')
(7568, 'Mon-Fri', '2P')
(7572, 'Mon-Sat', '2P')
(7573, 'Sat', '1P')
(7574, 'Mon-Fri', '1P')
(7575, 'Mon-Fri', '1P')
(7578, 'Mon-Fri', '2P')
(7579, 'Mon-Fri', '2P')
(7580, 'Mon-Sat', '4P')
(7582, 'Mon-Fri', '2P')
(7592, 'Mon-Sat', '1P')
(7595, 'Mon-Sat', '2P')
(7596, 'Mon-Sat', '2P')
(7598, 'Mon-Fri', '2P')
(7599, 'Mon-Fri', '2P')
(7599, 'Sat', '1P')
(7599, 'Sat', '2P')
(7605, 'Mon-Sat', '2P')
(7604, 'Mon-Sat', '2P')
(7606, 'Mon-Sat', '2P')
(7607, 'Mon-Fri', '2P')
(7608, 'Mon-Sat', '2P')
(7609, 'Mon-Sat', '2P')
(7612, 'Sat', '2P')
(7615, 'Mon-Sat', '2P')
(7618, 'Mon-Sat', '1P')
(7618, 'Mon-Sat', '2P')
(7622, 'Mon-Fri', '2P')
(7622, 'Sat', '2P')
(7625, 'Mon-Sat', '2P')
(7628, 'Mon-Fri', '2P')
(7633, 'Mon-Sat', '2P')
(7635, 'Mon-Sat', '3P')
(7638, 'Mon-Sun', '2P')
(7643, 'Mon-Fri', '2P')
(7644, 'Mon-Sat', '2P')
(7646, 'Mon-Fri', '2P')
(7653, 'Sat', '2P')
(7654, 'Mon-Fri', '1P')
(7663, 'Mon-Fri', '4P')
(7664, 'Sat', 'PP')
(7666, 'Mon-Fri', '2P')
(7666, 'Sat', '2P')
(7669, 'Mon-Fri', '2P')
(7679, 'Mon-Sat', 'HP')
(7681, 'Mon-Fri', '3P')
(7683, 'Mon-Fri', '1P')
(7687, 'Mon-Fri', '2P')
(7683, 'Sat', '2P')
(7685, 'Mon-Fri', '1P')
(7685, 'Sat', '2P')
(7695, 'Mon-Sat', '1P')
(7700, 'Mon-Sat', '1P')
(7700, 'Mon-Sat', '2P')
(7695, 'Mon-Sat', '2P')
(7705, 'Mon-Fri', '2P')
(7705, 'Sat', '2P')
(7714, 'Mon-Fri', '4P')
(7717, 'Mon-Fri', '4P')
(7717, 'Sat', '4P')
(7725, 'Mon-Fri', '1P')
(7725, 'Sat', '1P')
(7722, 'Sat', '1P')
(7726, 'Mon-Fri', '2P')
(7727, 'Mon-Fri', '2P')
(7727, 'Sat', '2P')
(7731, 'Mon-Fri', '4P')
(7730, 'Sat', '4P')
(7734, 'Mon-Fri', 'PP')
(7734, 'Sat', 'PP')
(7736, 'Mon-Fri', '3P')
(7736, 'Sat', '3P')
(7739, 'Mon-Fri', '1P')
(7739, 'Sat', '1P')
(7728, 'Sat', '2P')
(7740, 'Mon-Fri', '2P')
(7744, 'Mon-Fri', '4P')
(7744, 'Sat', '4P')
(7746, 'Mon-Fri', '4P')
(7756, 'Sat', '4P')
(7757, 'Mon-Fri', '2P')
(7761, 'Sat', '4P')
(7757, 'Sat', '2P')
(7766, 'Mon-Fri', '2P')
(7752, 'Mon-Sat', '1P')
(7775, 'Mon-Fri', '4P')
(7776, 'Mon-Sat', '4P')
(7783, 'Mon-Fri', '3P')
(7784, 'Mon-Fri', '4P')
(7785, 'Mon-Fri', '3P')
(7786, 'Mon-Fri', '3P')
(7798, 'Mon-Fri', '4P')
(7797, 'Sat', '4P')
(7799, 'Mon-Fri', '4P')
(7796, 'Sat', '4P')
(7751, 'Sat', '4P')
(7801, 'Sat', '1P')
(7805, 'Mon-Fri', 'PP')
(7814, 'Mon-Sat', '3P')
(7816, 'Mon-Fri', '2P')
(7817, 'Mon-Sat', '1P')
(7819, 'Mon-Sat', '2P')
(7817, 'Mon-Sat', '2P')
(7821, 'Sat', '1P')
(7822, 'Mon-Fri', '1P')
(7823, 'Mon-Sat', '2P')
(7824, 'Mon-Fri', '2P')
(7824, 'Sat', '1P')
(7827, 'Sat', '2P')
(7828, 'Mon-Fri', '2P')
(7833, 'Mon-Fri', '1P')
(7831, 'Mon-Fri', '1P')
(7826, 'Mon-Fri', '2P')
(7832, 'Mon-Fri', 'PP')
(7841, 'Mon-Fri', 'PP')
(7846, 'Mon-Sat', '2P')
(7847, 'Mon-Sat', '3P')
(7848, 'Mon-Sat', 'PP')
(7845, 'Mon-Fri', '3P')
(7849, 'Sat', '2P')
(7854, 'Mon-Sat', '3P')
(7852, 'Mon-Fri', 'PP')
(7852, 'Sat', 'PP')
(7853, 'Sat', '2P')
(7856, 'Mon-Fri', '1P')
(7864, 'Mon-Fri', '1P')
(7869, 'Mon-Fri', '4P')
(7876, 'Sat', '4P')
(7879, 'Mon-Fri', '4P')
(7884, 'Mon-Fri', '2P')
(7885, 'Mon-Fri', '2P')
(7885, 'Sat', '2P')
(7873, 'Mon-Sat', '4P')
(7889, 'Mon-Fri', '2P')
(7888, 'Mon-Fri', '1P')
(7893, 'Sat', '2P')
(7894, 'Sat', '4P')
(7902, 'Mon-Fri', 'PP')
(7906, 'Mon-Fri', 'PP')
(7898, 'Mon-Fri', 'PP')
(7899, 'Sat', '2P')
(7908, 'Mon-Fri', '4P')
(7909, 'Mon-Fri', '4P')
(7911, 'Mon-Fri', 'PP')
(7914, 'Mon-Fri', '4P')
(7913, 'Mon-Fri', '4P')
(7925, 'Mon-Fri', '4P')
(7925, 'Sat', '4P')
(7936, 'Sat', '2P')
(7937, 'Mon-Sat', '1P')
(7938, 'Sat', '2P')
(7940, 'Mon-Fri', 'PP')
(7940, 'Sat', 'PP')
(7941, 'Mon-Fri', 'PP')
(7941, 'Mon-Fri', 'PP')
(7943, 'Mon-Fri', '3P')
(7956, 'Mon-Fri', 'PP')
(7961, 'Mon-Fri', '4P')
(7965, 'Sat', '4P')
(7972, 'Mon-Sat', '3P')
(7981, 'Mon-Fri', '2P')
(7982, 'Mon-Fri', '4P')
(7982, 'Sat', '4P')
(7988, 'Mon-Fri', '1P')
(7990, 'Mon-Sat', '3P')
(7995, 'Mon-Fri', '2P')
(7004, 'Mon-Fri', '2P')
(7009, 'Mon-Fri', '1P')
(7009, 'Sat', '1P')
(7008, 'Sat', '1P')
(7010, 'Mon-Fri', '2P')
(7012, 'Mon-Fri', '2P')
(7012, 'Sat', '2P')
(7015, 'Mon-Fri', '3P')
(7010, 'Sat', '2P')
(7014, 'Mon-Fri', '1P')
(7014, 'Sat', '1P')
(7019, 'Sat', 'HP')
(7020, 'Mon-Fri', '1P')
(7023, 'Sat', '2P')
(7025, 'Mon-Fri', '2P')
(7027, 'Mon-Fri', '4P')
(7033, 'Mon-Fri', '2P')
(7033, 'Sat', '2P')
(7034, 'Mon-Fri', '2P')
(7028, 'Mon-Fri', '1P')
(7028, 'Sat', '1P')
(7030, 'Mon-Fri', '1P')
(7036, 'Mon-Fri', '2P')
(7041, 'Mon-Fri', '2P')
(7041, 'Sat', '2P')
(7044, 'Mon-Sat', '2P')
(7048, 'Sat', '1P')
(7050, 'Sat', '1P')
(7057, 'Sat', '4P')
(7068, 'Mon-Fri', '1P')
(7072, 'Mon-Fri', '1P')
(7067, 'Mon-Fri', '2P')
(7078, 'Mon-Fri', '2P')
(7078, 'Sat', '2P')
(7074, 'Sat', '4P')
(7081, 'Mon-Fri', '2P')
(7083, 'Mon-Fri', '2P')
(7084, 'Sat', '2P')
(7081, 'Sat', '2P')
(7086, 'Sat', '1P')
(7087, 'Sat', '2P')
(7089, 'Sat', '2P')
(7088, 'Mon-Fri', '4P')
(7092, 'Mon-Fri', '4P')
(7095, 'Mon-Fri', '1P')
(7095, 'Sat', '1P')
(7097, 'Mon-Fri', '1P')
(7102, 'Mon-Fri', '1P')
(7102, 'Sat', '1P')
(7107, 'Mon-Fri', '1P')
(7116, 'Sat', '2P')
(7119, 'Mon-Fri', '2P')
(7121, 'Mon-Fri', '2P')
(7122, 'Mon-Fri', '2P')
(7127, 'Mon-Fri', '2P')
(7127, 'Sat', '2P')
(7128, 'Mon-Fri', '1P')
(7128, 'Mon-Fri', '2P')
(7133, 'Sat', '2P')
(7135, 'Mon-Fri', '2P')
(7143, 'Mon-Fri', 'PP')
(7148, 'Mon-Fri', '4P')
(7154, 'Sat', 'PP')
(7161, 'Mon-Sat', '2P')
(7167, 'Mon-Sat', '2P')
(7190, 'Mon-Sun', '2P')
(7193, 'Mon-Sat', '2P')
(7195, 'Mon-Sat', '2P')
(7197, 'Mon-Sat', '2P')
(7202, 'Mon-Sat', '2P')
(7192, 'Mon-Sat', '3P')
(7200, 'Mon-Sat', '2P')
(7207, 'Mon-Sat', '2P')
(7221, 'Mon-Sat', '4P')
(7222, 'Sat', '2P')
(7224, 'Mon-Fri', '1P')
(7224, 'Mon-Fri', '2P')
(7224, 'Sat', '2P')
(7225, 'Mon-Fri', '2P')
(7223, 'Sat', '2P')
(7229, 'Mon-Fri', 'QP')
(7232, 'Mon-Sat', '2P')
(7231, 'Mon-Sat', '2P')
(7234, 'Mon-Fri', '1P')
(7236, 'Mon-Fri', '1P')
(7236, 'Sat', '1P')
(7239, 'Mon-Fri', '2P')
(7237, 'Mon-Fri', '2P')
(7241, 'Mon-Fri', '1P')
(7243, 'Mon-Fri', '1P')
(7244, 'Mon-Fri', '2P')
(7246, 'Mon-Fri', '1P')
(7250, 'Mon-Fri', '2P')
(7250, 'Sat', '2P')
(7251, 'Mon-Fri', '2P')
(7251, 'Sat', '2P')
(7243, 'Sat', '1P')
(7252, 'Mon-Fri', '2P')
(7259, 'Mon-Sat', '2P')
(7260, 'Mon-Fri', '1P')
(7260, 'Sat', '1P')
(7261, 'Mon-Sat', '2P')
(7266, 'Mon-Fri', '2P')
(7267, 'Mon-Sat', '2P')
(7273, 'Mon-Fri', '2P')
(7273, 'Sat', '2P')
(7277, 'Mon-Fri', '2P')
(7278, 'Mon-Sat', '1P')
(7280, 'Mon-Sat', '2P')
(7290, 'Sat', '2P')
(7296, 'Sat', '2P')
(7298, 'Mon-Fri', '2P')
(7300, 'Mon-Sat', 'PP')
(7317, 'Mon-Fri', '4P')
(7305, 'Mon-Sat', '4P')
(7297, 'Sat', '2P')
(7310, 'Mon-Sat', '2P')
(7327, 'Mon-Fri', 'PP')
(7330, 'Mon-Fri', '3P')
(7323, 'Mon-Sat', '3P')
(7332, 'Mon-Sat', '2P')
(7333, 'Sat', '2P')
(7334, 'Mon-Fri', '2P')
(7334, 'Sat-Sun', '2P')
(7335, 'Mon-Sat', '2P')
(7339, 'Mon-Sat', '1P')
(7343, 'Mon-Sun', '2P')
(7350, 'Mon-Sat', '2P')
(7352, 'Mon-Sat', 'HP')
(7352, 'Mon-Sat', '2P')
(7353, 'Mon-Fri', '1P')
(7355, 'Mon-Sat', '1P')
(7356, 'Mon-Fri', '2P')
(7359, 'Mon-Sun', '2P')
(7358, 'Mon-Sun', '2P')
(7373, 'Mon-Fri', '2P')
(7376, 'Sat', '4P')
(7374, 'Mon-Sat', '2P')
(7373, 'Sat', '2P')
(7377, 'Mon-Sat', '2P')
(7384, 'Mon-Sat', '1P')
(7386, 'Mon-Sat', '1P')
(7388, 'Mon-Sat', 'HP')
(7390, 'Mon-Sat', '1P')
(7390, 'Mon-Sat', '2P')
(7393, 'Mon-Sat', '2P')
(7396, 'Mon-Fri', '2P')
(7399, 'Sat-Sun', '2P')
(7401, 'Mon-Fri', '2P')
(7402, 'Mon-Fri', '2P')
(7402, 'Sat-Sun', '2P')
(7401, 'Sat-Sun', '2P')
(7418, 'Mon-Sat', '2P')
(7419, 'Sat', '2P')
(7422, 'Mon-Sat', 'HP')
(7423, 'Mon-Fri', '2P')
(7427, 'Mon-Fri', '2P')
(7429, 'Mon-Sat', '2P')
(7428, 'Mon-Sun', '2P')
(7434, 'Mon-Fri', '2P')
(7434, 'Sat', '1P')
(7435, 'Mon-Fri', '2P')
(7435, 'Mon-Fri', '2P')
(7435, 'Sat', '2P')
(7441, 'Mon-Fri', '2P')
(7440, 'Mon-Sat', '2P')
(7443, 'Mon-Sun', 'HP')
(7448, 'Mon-Sat', '1P')
(7448, 'Mon-Sat', '2P')
(7450, 'Mon-Fri', '2P')
(7471, 'Mon-Fri', '1P')
(7471, 'Mon-Fri', '2P')
(7474, 'Mon-Fri', '2P')
(7479, 'Mon-Fri', '2P')
(7481, 'Mon-Fri', '2P')
(7476, 'Mon-Fri', '2P')
(7476, 'Sat', '2P')
(7482, 'Mon-Fri', '2P')
(7486, 'Mon-Fri', '2P')
(7486, 'Sat', '2P')
(7487, 'Mon-Fri', '1P')
(7487, 'Mon-Fri', '2P')
(7494, 'Mon-Fri', '2P')
(7496, 'Mon-Sat', '2P')
(7507, 'Sat-Sun', '2P')
(7512, 'Mon-Fri', '2P')
(7518, 'Mon-Sat', '2P')
(7509, 'Mon-Sat', '3P')
(7521, 'Sat', '2P')
(7522, 'Mon-Fri', '2P')
(7523, 'Sat', '2P')
(7525, 'Mon-Sat', '2P')
(7528, 'Mon-Sat', '2P')
(7527, 'Mon-Fri', '2P')
(7527, 'Sat', '2P')
(7535, 'Mon-Sat', '2P')
(7536, 'Sat-Sun', '2P')
(7538, 'Mon-Sat', '2P')
(7544, 'Mon-Fri', '2P')
(7545, 'Mon-Sat', '2P')
(7540, 'Mon-Sat', '2P')
(7546, 'Mon-Sat', '2P')
(7546, 'Sat', '2P')
(7547, 'Mon-Fri', '2P')
(7548, 'Mon-Fri', '3P')
(7547, 'Sat', '2P')
(7549, 'Mon-Fri', '2P')
(7549, 'Sat', '2P')
(7550, 'Mon-Sat', '2P')
(7551, 'Mon-Fri', '2P')
(7552, 'Mon-Sat', '2P')
(7555, 'Mon-Fri', '2P')
(7555, 'Sat', '2P')
(7557, 'Sat', '1P')
(7558, 'Mon-Fri', '2P')
(7558, 'Sat', '1P')
(7562, 'Sat', '2P')
(7566, 'Mon-Sat', '2P')
(7567, 'Mon-Fri', '1P')
(7567, 'Sat', '1P')
(7567, 'Sat', '2P')
(7570, 'Mon-Fri', '1P')
(7570, 'Mon-Fri', '2P')
(7570, 'Sat', '1P')
(7569, 'Sat', '2P')
(7573, 'Mon-Fri', '1P')
(7574, 'Mon-Fri', '2P')
(7574, 'Sat', '1P')
(7574, 'Sat', '2P')
(7575, 'Mon-Fri', '2P')
(7575, 'Sat', '1P')
(7577, 'Mon-Sat', '2P')
(7579, 'Sat-Sun', '2P')
(7584, 'Mon-Fri', '2P')
(7584, 'Mon-Fri', 'QP')
(7584, 'Sat', 'PP')
(7586, 'Mon-Fri', '2P')
(7587, 'Mon-Sat', '4P')
(7589, 'Mon-Fri', '2P')
(7592, 'Mon-Sat', '2P')
(7597, 'Mon-Sat', '2P')
(7599, 'Mon-Fri', '1P')
(7600, 'Mon-Sat', '2P')
(7601, 'Mon-Sat', '2P')
(7611, 'Mon-Sat', '2P')
(7612, 'Mon-Fri', '2P')
(7616, 'Mon-Sat', '1P')
(7616, 'Mon-Sat', '2P')
(7617, 'Mon-Sat', '1P')
(7624, 'Mon-Fri', '2P')
(7624, 'Sat', '2P')
(7633, 'Mon-Sat', '1P')
(7632, 'Mon-Sat', '2P')
(7634, 'Mon-Sat', '2P')
(7634, 'Sat', '2P')
(7641, 'Mon-Sat', '2P')
(7643, 'Sat', 'HP')
(7643, 'Sat', '2P')
(7646, 'Sat', '2P')
(7652, 'Mon-Sat', '4P')
(7653, 'Mon-Fri', '2P')
(7656, 'Mon-Fri', '1P')
(7665, 'Mon-Fri', '2P')
(7665, 'Sat', '2P')
(7667, 'Mon-Fri', '1P')
(7675, 'Mon-Sat', '1P')
(7677, 'Mon-Sat', '2P')
(7670, 'Mon-Fri', '2P')
(7678, 'Mon-Fri', '2P')
(7678, 'Mon-Fri', '2P')
(7678, 'Sat', '2P')
(7680, 'Mon-Fri', '1P')
(7680, 'Mon-Fri', '2P')
(7680, 'Sat', '1P')
(7681, 'Mon-Fri', '3P')
(7681, 'Sat', '3P')
(7682, 'Mon-Fri', '3P')
(7682, 'Sat', '3P')
(7679, 'Mon-Sat', '2P')
(7687, 'Mon-Fri', '2P')
(7692, 'Mon-Fri', '2P')
(7692, 'Sat', '2P')
(7707, 'Mon-Fri', '2P')
(7709, 'Mon-Fri', '4P')
(7709, 'Sat', '4P')
(7708, 'Sat', '2P')
(7711, 'Mon-Sat', '1P')
(7716, 'Mon-Sat', '2P')
(7721, 'Mon-Sat', '1P')
(7713, 'Mon-Sat', '1P')
(7707, 'Sat', '2P')
(7723, 'Sat', 'PP')
(7724, 'Mon-Fri', '4P')
(7726, 'Sat', '2P')
(7741, 'Sat', '4P')
(7740, 'Sat', '2P')
(7747, 'Mon-Fri', '4P')
(7747, 'Sat', '4P')
(7749, 'Mon-Sat', '1P')
(7753, 'Mon-Fri', '2P')
(7766, 'Sat', '2P')
(7778, 'Mon-Fri', '4P')
(7775, 'Sat', '4P')
(7787, 'Mon-Fri', '2P')
(7789, 'Sat', 'PP')
(7797, 'Mon-Fri', '4P')
(7798, 'Sat', '4P')
(7751, 'Mon-Fri', '4P')
(7801, 'Mon-Fri', '2P')
(7802, 'Mon-Fri', '4P')
(7804, 'Mon-Fri', 'PP')
(7806, 'Mon-Fri', 'PP')
(7807, 'Sat', 'PP')
(7809, 'Sat', 'PP')
(7813, 'Mon-Sat', '3P')
(7801, 'Sat', '2P')
(7812, 'Mon-Fri', '2P')
(7818, 'Mon-Sat', '2P')
(7820, 'Mon-Sat', '2P')
(7821, 'Mon-Fri', '1P')
(7822, 'Sat', '2P')
(7821, 'Sat', '2P')
(7824, 'Sat', '2P')
(7827, 'Mon-Fri', '2P')
(7829, 'Mon-Fri', '2P')
(7825, 'Mon-Sat', '1P')
(7830, 'Mon-Fri', '2P')
(7837, 'Mon-Fri', '3P')
(7843, 'Mon-Fri', '2P')
(7850, 'Mon-Sat', '1P')
(7850, 'Mon-Sat', '2P')
(7855, 'Mon-Sat', '1P')
(7861, 'Mon-Fri', 'PP')
(7867, 'Mon-Fri', 'PP')
(7867, 'Sat', 'PP')
(7869, 'Sat', '4P')
(7876, 'Mon-Fri', '4P')
(7878, 'Mon-Fri', 'PP')
(7882, 'Mon-Fri', '4P')
(7882, 'Sat', '4P')
(7883, 'Mon-Fri', 'PP')
(7883, 'Sat', 'PP')
(7880, 'Mon-Sat', '2P')
(7884, 'Sat', '2P')
(7892, 'Mon-Fri', '2P')
(7893, 'Mon-Fri', '2P')
(7894, 'Mon-Fri', '4P')
(7895, 'Mon-Fri', 'PP')
(7890, 'Sat', '1P')
(7896, 'Mon-Fri', 'PP')
(7903, 'Mon-Fri', '2P')
(7896, 'Sat', 'PP')
(7900, 'Mon-Fri', '2P')
(7899, 'Mon-Fri', '2P')
(7908, 'Sat', '4P')
(7910, 'Mon-Sat', '2P')
(7918, 'Sat', '4P')
(7904, 'Mon-Fri', '3P')
(7915, 'Mon-Fri', '2P')
(7915, 'Sat', '2P')
(7919, 'Sat', '3P')
(7922, 'Mon-Sun', '1P')
(7928, 'Mon-Fri', '3P')
(7938, 'Mon-Fri', '2P')
(7939, 'Mon-Fri', '2P')
(7939, 'Sat', '2P')
(7942, 'Mon-Fri', '3P')
(7942, 'Sat', '3P')
(7948, 'Mon-Sat', '2P')
(7954, 'Mon-Fri', '4P')
(7954, 'Sat', '4P')
(7962, 'Mon-Fri', '4P')
(7963, 'Mon-Fri', '4P')
(7965, 'Mon-Fri', '4P')
(7966, 'Mon-Fri', '4P')
(7966, 'Sat', '4P')
(7971, 'Mon-Sat', '3P')
(7968, 'Mon-Sat', 'HP')
(7970, 'Mon-Sat', '3P')
(7977, 'Mon-Fri', '4P')
(7975, 'Mon-Fri', '4P')
(7987, 'Mon-Sat', '4P')
(7986, 'Mon-Fri', '2P')
(7002, 'Mon-Fri', '4P')
(7002, 'Sat', '4P')
(7003, 'Sat', '2P')
(7007, 'Sat', '2P')
(7018, 'Sat', '2P')
(7023, 'Mon-Fri', '2P')
(7035, 'Sat', '2P')
(7030, 'Sat', '1P')
(7043, 'Sat', '4P')
(7048, 'Mon-Fri', '1P')
(7049, 'Mon-Sat', '2P')
(7056, 'Mon-Fri', '1P')
(7061, 'Sat', '2P')
(7062, 'Mon-Fri', '2P')
(7066, 'Mon-Fri', '2P')
(7069, 'Mon-Fri', '1P')
(7072, 'Sat', '1P')
(7067, 'Sat', '2P')
(7076, 'Mon-Fri', '2P')
(7079, 'Mon-Fri', '4P')
(7082, 'Sat', 'PP')
(7086, 'Mon-Fri', '1P')
(7087, 'Mon-Fri', '2P')
(7089, 'Mon-Fri', '2P')
(7088, 'Sat', '4P')
(7101, 'Mon-Fri', 'HP')
(7104, 'Sat', '1P')
(7107, 'Sat', '1P')
(7109, 'Mon-Fri', '1P')
(7112, 'Sat', '2P')
(7113, 'Sat', '2P')
(7116, 'Mon-Fri', '2P')
(7127, 'Mon-Fri', '2P')
(7135, 'Mon-Fri', '2P')
(7137, 'Mon-Fri', 'PP')
(7138, 'Mon-Fri', 'PP')
(7140, 'Mon-Fri', '4P')
(7146, 'Mon-Fri', '4P')
(7135, 'Sat', '2P')
(7152, 'Mon-Fri', '4P')
(7154, 'Mon-Fri', 'PP')
(7153, 'Mon-Fri', '4P')
(7159, 'Mon-Sat', '2P')
(7158, 'Mon-Sat', '3P')
(7165, 'Mon-Sat', '2P')
(7170, 'Mon-Sat', '2P')
(7171, 'Mon-Sat', '2P')
(7175, 'Mon-Sat', '2P')
(7188, 'Mon-Sat', '2P')
(7184, 'Mon-Sat', '2P')
(7190, 'Mon-Fri', '2P')
(7194, 'Mon-Sat', '2P')
(7203, 'Mon-Sat', '2P')
(7208, 'Mon-Sat', '2P')
(7214, 'Mon-Sat', '2P')
(7204, 'Mon-Sat', '2P')
(7222, 'Mon-Fri', 'QP')
(7222, 'Mon-Fri', '2P')
(7224, 'Sat', '1P')
(7225, 'Mon-Fri', '2P')
(7225, 'Sat', '2P')
(7227, 'Mon-Sat', '2P')
(7228, 'Mon-Fri', 'QP')
(7229, 'Mon-Fri', '2P')
(7233, 'Mon-Sat', '3P')
(7234, 'Sat', '1P')
(7235, 'Mon-Fri', 'PP')
(7239, 'Sat', '2P')
(7240, 'Mon-Fri', 'SP')
(7241, 'Sat', '1P')
(7244, 'Sat', '2P')
(7255, 'Mon-Fri', '2P')
(7258, 'Mon-Fri', '2P')
(7258, 'Sat', '2P')
(7253, 'Sat', '2P')
(7254, 'Mon-Sat', '2P')
(7270, 'Mon-Fri', '2P')
(7269, 'Mon-Sat', '2P')
(7271, 'Mon-Fri', '2P')
(7273, 'Mon-Fri', 'SP')
(7287, 'Mon-Fri', 'PP')
(7284, 'Sat', '2P')
(7288, 'Sat', '2P')
(7290, 'Mon-Fri', '2P')
(7296, 'Mon-Fri', '2P')
(7302, 'Mon-Sun', '2P')
(7304, 'Mon-Fri', '4P')
(7304, 'Sat', '4P')
(7307, 'Mon-Fri', '2P')
(7307, 'Sat', '2P')
(7314, 'Mon-Fri', '2P')
(7325, 'Mon-Sat', '4P')
(7328, 'Mon-Fri', '4P')
(7322, 'Mon-Sat', '3P')
(7314, 'Sat', '2P')
(7332, 'Mon-Sat', '1P')
(7333, 'Mon-Fri', '2P')
(7336, 'Mon-Sat', '2P')
(7337, 'Mon-Sat', '2P')
(7339, 'Mon-Fri', '2P')
(7341, 'Mon-Sat', '2P')
(7342, 'Mon-Fri', '2P')
(7342, 'Sat', '2P')
(7345, 'Mon-Fri', '2P')
(7345, 'Sat-Sun', '2P')
(7348, 'Mon-Fri', '2P')
(7350, 'Mon-Sat', '1P')
(7351, 'Mon-Sat', 'HP')
(7355, 'Mon-Sat', '2P')
(7356, 'Sat-Sun', '2P')
(7362, 'Mon-Sat', '1P')
(7362, 'Mon-Sat', '2P')
(7363, 'Mon-Fri', '2P')
(7371, 'Mon-Fri', '3P')
(7367, 'Sat', '2P')
(7370, 'Mon-Fri', 'PP')
(7372, 'Mon-Fri', 'PP')
(7375, 'Mon-Fri', '4P')
(7383, 'Mon-Sat', '2P')
(7379, 'Mon-Sat', '2P')
(7385, 'Mon-Fri', '2P')
(7385, 'Sat', '2P')
(7387, 'Mon-Sat', '2P')
(7392, 'Mon-Fri', '2P')
(7392, 'Sat', '2P')
(7394, 'Mon-Sat', '1P')
(7391, 'Mon-Sat', '2P')
(7395, 'Mon-Sat', '2P')
(7396, 'Sat', '2P')
(7401, 'Mon-Fri', '2P')
(7406, 'Mon-Fri', '2P')
(7406, 'Mon-Fri', '2P')
(7406, 'Sat', '2P')
(7407, 'Mon-Fri', '2P')
(7408, 'Mon-Sat', '2P')
(7411, 'Sat-Sun', '2P')
(7412, 'Mon-Fri', '2P')
(7414, 'Mon-Sat', '2P')
(7412, 'Sat-Sun', '2P')
(7417, 'Mon-Fri', 'QP')
(7421, 'Mon-Sat', '2P')
(7419, 'Mon-Fri', '2P')
(7422, 'Mon-Sat', '2P')
(7425, 'Mon-Sat', '2P')
(7427, 'Mon-Fri', '1P')
(7429, 'Mon-Sat', '1P')
(7433, 'Mon-Fri', '2P')
(7432, 'Mon-Sun', '1P')
(7434, 'Mon-Fri', '1P')
(7432, 'Mon-Sun', '1P')
(7438, 'Mon-Sat', '2P')
(7441, 'Mon-Fri', '2P')
(7442, 'Mon-Sun', '2P')
(7444, 'Mon-Sat', '2P')
(7445, 'Sat', '2P')
(7465, 'Mon-Sat', '2P')
(7451, 'Mon-Sun', '2P')
(7454, 'Mon-Fri', '2P')
(7466, 'Mon-Sat', '3P')
(7469, 'Mon-Fri', 'PP')
(7469, 'Sat', 'PP')
(7446, 'Sat-Sun', '2P')
(7461, 'Mon-Sat', 'HP')
(7468, 'Mon-Fri', 'PP')
(7471, 'Sat', '1P')
(7474, 'Mon-Fri', '2P')
(7474, 'Sat', '2P')
(7468, 'Sat', 'PP')
(7461, 'Mon-Sat', '2P')
(7479, 'Mon-Fri', '2P')
(7481, 'Mon-Fri', '2P')
(7481, 'Sat', '2P')
(7476, 'Sat', '1P')
(7513, 'Mon-Fri', 'PP')
(7493, 'Mon-Sat', '2P')
(7494, 'Sat', '2P')
(7482, 'Sat', '2P')
(7507, 'Mon-Fri', '2P')
(7508, 'Sat-Sun', '2P')
(7514, 'Mon-Fri', '2P')
(7515, 'Mon-Sat', 'HP')
(7515, 'Mon-Sat', '2P')
(7517, 'Mon-Sat', '2P')
(7518, 'Mon-Sat', '1P')
(7512, 'Sat-Sun', '2P')
(7519, 'Mon-Sat', '1P')
(7519, 'Mon-Sat', '2P')
(7522, 'Sat', '2P')
(7523, 'Mon-Fri', '2P')
(7531, 'Mon-Sat', '2P')
(7529, 'Sat-Sun', '2P')
(7534, 'Mon-Sat', 'QP')
(7534, 'Mon-Sat', '2P')
(7535, 'Mon-Sat', '1P')
(7536, 'Mon-Fri', '2P')
(7537, 'Mon-Fri', '2P')
(7538, 'Mon-Sat', '1P')
(7546, 'Mon-Fri', 'QP')
(7548, 'Sat', '3P')
(7553, 'Mon-Fri', '2P')
(7557, 'Mon-Fri', '2P')
(7562, 'Mon-Fri', '2P')
(7568, 'Sat', '1P')
(7568, 'Sat', '2P')
(7570, 'Sat', '2P')
(7571, 'Mon-Fri', '2P')
(7571, 'Sat', '2P')
(7573, 'Mon-Fri', '2P')
(7573, 'Sat', '2P')
(7575, 'Sat', '2P')
(7578, 'Mon-Fri', '2P')
(7578, 'Sat', '2P')
(7582, 'Sat', '2P')
(7584, 'Mon-Fri', '5P')
(7585, 'Mon-Sat', 'PP')
(7584, 'Mon-Fri', 'QP')
(7589, 'Sat', '2P')
(7594, 'Mon-Sat', '2P')
(7598, 'Sat', '2P')
(7600, 'Mon-Sat', '1P')
(7602, 'Mon-Fri', '2P')
(7602, 'Sat', '2P')
(7603, 'Mon-Fri', '1P')
(7603, 'Mon-Fri', '2P')
(7603, 'Sat', '1P')
(7606, 'Mon-Sat', 'HP')
(7603, 'Sat', '2P')
(7610, 'Mon-Sat', '1P')
(7610, 'Mon-Sat', '2P')
(7607, 'Sat', '2P')
(7614, 'Mon-Fri', '2P')
(7614, 'Sat', '2P')
(7617, 'Mon-Sat', '2P')
(7622, 'Mon-Fri', '2P')
(7624, 'Mon-Fri', '2P')
(7625, 'Mon-Sat', '1P')
(7628, 'Sat-Sun', '2P')
(7634, 'Mon-Fri', '2P')
(7639, 'Mon-Fri', '2P')
(7639, 'Mon-Sat', '2P')
(7639, 'Sat', '2P')
(7642, 'Mon-Sat', '2P')
(7643, 'Mon-Fri', 'HP')
(7647, 'Mon-Sat', '2P')
(7649, 'Mon-Sat', '1P')
(7649, 'Mon-Sat', '2P')
(7650, 'Mon-Sat', '3P')
(7655, 'Mon-Fri', '2P')
(7655, 'Sat', '2P')
(7662, 'Mon-Fri', '3P')
(7662, 'Sat', '3P')
(7663, 'Sat', '4P')
(7664, 'Mon-Fri', 'PP')
(7651, 'Mon-Sat', '4P')
(7674, 'Mon-Sun', '2P')
(7669, 'Sat', '2P')
(7680, 'Sat', '2P')
(7682, 'Mon-Fri', '3P')
(7683, 'Mon-Fri', '2P')
(7683, 'Sat', '1P')
(7687, 'Sat', '2P')
(7688, 'Mon-Sat', '4P')
(7685, 'Mon-Fri', '2P')
(7685, 'Sat', '1P')
(7698, 'Mon-Sat', '2P')
(7706, 'Mon-Sat', '2P')
(7708, 'Mon-Fri', '2P')
(7712, 'Mon-Sat', '1P')
(7714, 'Sat', '4P')
(7720, 'Mon-Fri', '2P')
(7720, 'Sat', '2P')
(7722, 'Mon-Fri', '1P')
(7723, 'Mon-Fri', 'PP')
(7724, 'Sat', '4P')
(7728, 'Mon-Fri', '2P')
(7729, 'Mon-Sat', 'PP')
(7731, 'Sat', '4P')
(7730, 'Mon-Fri', '4P')
(7732, 'Sat', '2P')
(7741, 'Mon-Fri', '4P')
(7748, 'Mon-Fri', '2P')
(7748, 'Sat', '2P')
(7756, 'Mon-Fri', '4P')
(7753, 'Sat', '2P')
(7761, 'Mon-Fri', '4P')
(7778, 'Sat', '4P')
(7781, 'Mon-Fri', 'PP')
(7781, 'Sat', 'PP')
(7782, 'Mon-Fri', 'PP')
(7782, 'Sat', 'PP')
(7786, 'Sat', '3P')
(7784, 'Sat', '4P')
(7789, 'Mon-Fri', 'PP')
(7790, 'Mon-Fri', 'PP')
(7787, 'Sat', '2P')
(7796, 'Mon-Fri', '4P')
(7799, 'Sat', '4P')
(7800, 'Mon-Fri', '1P')
(7800, 'Sat', '1P')
(7801, 'Mon-Fri', '1P')
(7807, 'Mon-Fri', 'PP')
(7808, 'Mon-Fri', 'PP')
(7809, 'Mon-Fri', 'PP')
(7802, 'Sat', '4P')
(7812, 'Sat', '2P')
(7815, 'Mon-Sat', '2P')
(7816, 'Sat', '2P')
(7819, 'Mon-Sat', '1P')
(7821, 'Mon-Fri', '2P')
(7822, 'Mon-Fri', '2P')
(7822, 'Sat', '1P')
(7824, 'Mon-Fri', '1P')
(7825, 'Mon-Sat', '2P')
(7834, 'Mon-Fri', 'PP')
(7836, 'Mon-Fri', '2P')
(7842, 'Mon-Fri', '1P')
(7835, 'Mon-Fri', 'PP')
(7844, 'Mon-Fri', '2P')
(7849, 'Mon-Fri', '2P')
(7851, 'Mon-Sat', '3P')
(7853, 'Mon-Fri', '2P')
(7855, 'Mon-Sat', '2P')
(7858, 'Mon-Fri', 'PP')
(7859, 'Mon-Fri', '3P')
(7860, 'Mon-Fri', '2P')
(7862, 'Mon-Fri', '2P')
(7863, 'Mon-Fri', 'PP')
(7857, 'Mon-Sat', '2P')
(7870, 'Mon-Sat', '3P')
(7871, 'Mon-Sat', '2P')
(7864, 'Sat', '1P')
(7868, 'Mon-Sat', '2P')
(7880, 'Mon-Sat', '1P')
(7881, 'Mon-Fri', '2P')
(7886, 'Mon-Fri', '2P')
(7887, 'Mon-Fri', '2P')
(7887, 'Sat', '2P')
(7889, 'Sat', '2P')
(7886, 'Sat', '2P')
(7890, 'Mon-Fri', '1P')
(7892, 'Sat', '2P')
(7895, 'Sat', 'PP')
(7888, 'Sat', '1P')
(7905, 'Mon-Fri', '2P')
(7905, 'Sat', '2P')
(7907, 'Mon-Fri', '2P')
(7918, 'Mon-Fri', '4P')
(7907, 'Sat', '2P')
(7912, 'Mon-Fri', 'PP')
(7919, 'Mon-Fri', '3P')
(7923, 'Mon-Fri', '2P')
(7923, 'Sat', '2P')
(7924, 'Mon-Fri', '2P')
(7924, 'Sat', '2P')
(7916, 'Mon-Fri', '4P')
(7926, 'Mon-Fri', '1P')
(7926, 'Sat', '1P')
(7927, 'Mon-Sat', '3P')
(7932, 'Mon-Sat', '3P')
(7935, 'Mon-Fri', '4P')
(7930, 'Mon-Sat', '2P')
(7936, 'Mon-Fri', '2P')
(7939, 'Mon-Fri', '2P')
(7940, 'Mon-Fri', 'PP')
(7942, 'Mon-Fri', '3P')
(7945, 'Mon-Fri', 'PP')
(7947, 'Mon-Sat', '2P')
(7950, 'Mon-Fri', 'PP')
(7943, 'Mon-Fri', '3P')
(7943, 'Sat', '3P')
(7956, 'Sat', 'PP')
(7964, 'Mon-Fri', 'PP')
(7964, 'Sat', 'PP')
(7973, 'Mon-Fri', 'PP')
(7941, 'Sat', 'PP')
(7968, 'Mon-Sat', '2P')
(7974, 'Mon-Sat', '2P')
(7977, 'Sat', '4P')
(7981, 'Sat', '2P')
(7985, 'Mon-Fri', '2P')
(7992, 'Mon-Sat', '4P')
(7993, 'Mon-Fri', '2P')
(7996, 'Mon-Sat', '4P')
(7000, 'Mon-Sun', '5P')
(7001, 'Mon-Fri', '2P')
(7001, 'Sat', '2P')
(7004, 'Sat', '2P')
(7003, 'Mon-Fri', '2P')
(7007, 'Mon-Fri', '2P')
(7008, 'Mon-Fri', '1P')
(7015, 'Sat', '3P')
(7018, 'Mon-Fri', '2P')
(7019, 'Mon-Fri', 'HP')
(7025, 'Sat', '2P')
(7020, 'Sat', '1P')
(7027, 'Sat', '4P')
(7031, 'Mon-Fri', '2P')
(7031, 'Sat', '2P')
(7034, 'Sat', '2P')
(7035, 'Mon-Fri', '2P')
(7043, 'Mon-Fri', '4P')
(7047, 'Mon-Fri', '2P')
(7047, 'Sat', '2P')
(7050, 'Mon-Fri', '1P')
(7053, 'Mon-Sat', '1P')
(7057, 'Mon-Fri', '4P')
(7056, 'Sat', '1P')
(7061, 'Mon-Fri', '2P')
(7062, 'Sat', '2P')
(7066, 'Sat', '2P')
(7068, 'Sat', '1P')
(7069, 'Sat', '1P')
(7036, 'Sat', '2P')
(7074, 'Mon-Fri', '4P')
(7076, 'Sat', '2P')
(7077, 'Mon-Sat', '4P')
(7082, 'Mon-Fri', 'PP')
(7084, 'Mon-Fri', '2P')
(7083, 'Sat', '2P')
(7085, 'Mon-Fri', '2P')
(7092, 'Sat', '4P')
(7097, 'Sat', '1P')
(7100, 'Mon-Fri', '2P')
(7100, 'Sat', '2P')
(7101, 'Sat', 'HP')
(7104, 'Mon-Fri', '1P')
(7103, 'Mon-Fri', '2P')
(7103, 'Sat', '2P')
(7105, 'Mon-Sat', '2P')
(7112, 'Mon-Fri', '2P')
(7113, 'Mon-Fri', '2P')
(7119, 'Sat', '2P')
(7121, 'Sat', '2P')
(7109, 'Sat', '1P')
(7126, 'Mon-Fri', '1P')
(7126, 'Mon-Fri', '2P')
(7126, 'Sat', '1P')
(7126, 'Sat', '2P')
(7128, 'Sat', '1P')
(7128, 'Sat', '2P')
(7133, 'Mon-Fri', '2P')
(7133, 'Mon-Fri', '2P')
(7134, 'Mon-Fri', '2P')
(7134, 'Mon-Fri', '2P')
(7134, 'Sat', '2P')
(7140, 'Sat', '4P')
(7145, 'Mon-Fri', 'PP')
(7147, 'Mon-Fri', '4P')
(7147, 'Sat', '4P')
(7149, 'Mon-Fri', '4P')
(7150, 'Mon-Fri', '4P')
(7151, 'Mon-Fri', '4P')
(7156, 'Mon-Sat', '2P')
(7122, 'Sat', '2P')
(7157, 'Mon-Sat', '2P')
(7160, 'Mon-Sat', '2P')
(7163, 'Mon-Sat', '2P')
(7178, 'Mon-Sat', '2P')
(7173, 'Mon-Sat', '2P')
(7180, 'Mon-Sat', '4P')
(7183, 'Mon-Sat', '2P')
(7186, 'Mon-Sat', '2P')
(7182, 'Mon-Sat', '2P')
(7185, 'Mon-Sat', '2P')
(7189, 'Mon-Sun', '2P')
(7190, 'Sat-Sun', '2P')
(7191, 'Mon-Sat', '2P')
(7196, 'Mon-Sat', '2P')
(7205, 'Mon-Sat', '2P')
(7206, 'Mon-Fri', '2P')
(7206, 'Sat', '2P')
(7209, 'Mon-Sat', '3P')
(7212, 'Mon-Sat', '2P')
(7213, 'Mon-Sat', '2P')
(7219, 'Mon-Sat', '2P')
(7220, 'Mon-Sat', '2P')
(7217, 'Mon-Sat', '3P')
(7222, 'Mon-Fri', 'QP')
(7223, 'Mon-Fri', '2P')
(7228, 'Mon-Fri', 'QP')
(7228, 'Mon-Fri', '2P')
(7228, 'Sat', '2P')
(7229, 'Mon-Fri', 'QP')
(7230, 'Mon-Sat', '2P')
(7235, 'Sat', 'PP')
(7237, 'Sat', '2P')
(7240, 'Mon-Fri', '2P')
(7240, 'Mon-Fri', 'SP')
(7245, 'Mon-Fri', '2P')
(7245, 'Sat', '2P')
(7247, 'Mon-Sat', '2P')
(7253, 'Mon-Fri', '2P')
(7256, 'Mon-Fri', '4P')
(7256, 'Sat', '4P')
(7263, 'Mon-Fri', '4P')
(7263, 'Sat', '4P')
(7262, 'Mon-Fri', 'PP')
(7265, 'Mon-Fri', '2P')
(7265, 'Sat', '2P')
(7264, 'Mon-Fri', '1P')
(7249, 'Mon-Sat', '2P')
(7274, 'Mon-Sat', '3P')
(7266, 'Sat', '2P')
(7275, 'Mon-Sat', '2P')
(7277, 'Mon-Fri', '2P')
(7277, 'Sat', '2P')
(7282, 'Mon-Sat', '2P')
(7284, 'Mon-Fri', '2P')
(7285, 'Mon-Fri', '2P')
(7288, 'Mon-Fri', '2P')
(7289, 'Mon-Fri', '2P')
(7289, 'Sat', '2P')
(7297, 'Mon-Fri', '2P')
(7298, 'Sat', '2P')
(7301, 'Mon-Sat', '2P')
(7306, 'Mon-Sat', '2P')
(7309, 'Mon-Fri', '2P')
(7309, 'Sat', '2P')
(7320, 'Mon-Sun', '2P')
(7331, 'Mon-Sat', '2P')
(7336, 'Mon-Sat', '1P')
(7338, 'Mon-Fri', '2P')
(7338, 'Sat', '2P')
(7339, 'Mon-Sat', '2P')
(7339, 'Sat', '2P')
(7351, 'Mon-Sat', '2P')
(7353, 'Mon-Fri', '2P')
(7353, 'Sat', '2P')
(7360, 'Mon-Sun', '2P')
(7363, 'Sat-Sun', '2P')
(7366, 'Mon-Fri', '2P')
(7366, 'Sat-Sun', '2P')
(7367, 'Mon-Fri', '2P')
(7369, 'Mon-Sat', '3P')
(7375, 'Sat', '4P')
(7376, 'Mon-Fri', '4P')
(7379, 'Mon-Sat', '1P')
(7384, 'Mon-Sat', '2P')
(7388, 'Mon-Sat', '2P')
(7391, 'Mon-Sat', '1P')
(7399, 'Mon-Fri', '2P')
(7400, 'Mon-Fri', '2P')
(7400, 'Sat-Sun', '2P')
(7407, 'Mon-Fri', '2P')
(7407, 'Sat', '2P')
(7411, 'Mon-Fri', '2P')
(7413, 'Mon-Sun', '2P')
(7417, 'Mon-Fri', '2P')
(7417, 'Sat', '2P')
(7421, 'Mon-Sat', '1P')
(7423, 'Sat-Sun', '2P')
(7424, 'Mon-Sat', '2P')
(7425, 'Mon-Sat', '1P')
(7426, 'Mon-Fri', '2P')
(7426, 'Sat', '2P')
(7427, 'Sat', '1P')
(7427, 'Sat', '2P')
(7433, 'Mon-Fri', '2P')
(7433, 'Sat', '2P')
(7434, 'Sat', '2P')
(7436, 'Mon-Sun', '2P')
(7440, 'Mon-Sat', '1P')
(7441, 'Sat', '2P')

Query 2: Filter Data (WHERE Clause)

Query 3: Combine Tables (JOIN Clause)

Query 4: Classify User Types (CASE Statement)
(None, 'High Utilization')
(7010.0, 'Low Utilization')
(7014.0, 'Low Utilization')
(7018.0, 'Low Utilization')
(7019.0, 'Low Utilization')
(7025.0, 'Low Utilization')
(7049.0, 'Low Utilization')
(7053.0, 'Low Utilization')
(7076.0, 'Low Utilization')
(7081.0, 'Low Utilization')
(7084.0, 'Low Utilization')
(7089.0, 'Low Utilization')
(7090.0, 'Low Utilization')
(7096.0, 'Low Utilization')
(7156.0, 'Low Utilization')
(7159.0, 'Low Utilization')
(7160.0, 'Low Utilization')
(7161.0, 'Low Utilization')
(7163.0, 'Low Utilization')
(7165.0, 'Low Utilization')
(7167.0, 'Low Utilization')
(7170.0, 'Low Utilization')
(7173.0, 'Low Utilization')
(7178.0, 'Low Utilization')
(7182.0, 'Low Utilization')
(7183.0, 'Low Utilization')
(7184.0, 'Low Utilization')
(7185.0, 'Low Utilization')
(7186.0, 'Low Utilization')
(7188.0, 'Low Utilization')
(7189.0, 'Low Utilization')
(7190.0, 'Low Utilization')
(7191.0, 'Low Utilization')
(7193.0, 'Low Utilization')
(7194.0, 'Low Utilization')
(7195.0, 'Low Utilization')
(7197.0, 'Low Utilization')
(7200.0, 'Low Utilization')
(7202.0, 'Low Utilization')
(7203.0, 'Low Utilization')
(7205.0, 'Low Utilization')
(7207.0, 'Low Utilization')
(7208.0, 'Low Utilization')
(7210.0, 'Low Utilization')
(7212.0, 'Low Utilization')
(7213.0, 'Low Utilization')
(7214.0, 'Low Utilization')
(7218.0, 'Low Utilization')
(7219.0, 'Low Utilization')
(7220.0, 'Low Utilization')
(7222.0, 'Low Utilization')
(7223.0, 'Low Utilization')
(7226.0, 'Low Utilization')
(7227.0, 'Low Utilization')
(7228.0, 'Low Utilization')
(7229.0, 'Low Utilization')
(7230.0, 'Low Utilization')
(7231.0, 'Low Utilization')
(7232.0, 'Low Utilization')
(7234.0, 'Low Utilization')
(7236.0, 'Low Utilization')
(7237.0, 'Low Utilization')
(7239.0, 'Low Utilization')
(7241.0, 'Low Utilization')
(7243.0, 'Low Utilization')
(7244.0, 'Low Utilization')
(7245.0, 'Low Utilization')
(7246.0, 'Low Utilization')
(7247.0, 'Low Utilization')
(7250.0, 'Low Utilization')
(7251.0, 'Low Utilization')
(7252.0, 'Low Utilization')
(7253.0, 'Low Utilization')
(7254.0, 'Low Utilization')
(7255.0, 'Low Utilization')
(7258.0, 'Low Utilization')
(7259.0, 'Low Utilization')
(7260.0, 'Low Utilization')
(7261.0, 'Low Utilization')
(7264.0, 'Low Utilization')
(7265.0, 'Low Utilization')
(7266.0, 'Low Utilization')
(7267.0, 'Low Utilization')
(7269.0, 'Low Utilization')
(7270.0, 'Low Utilization')
(7271.0, 'Low Utilization')
(7273.0, 'Low Utilization')
(7274.0, 'Low Utilization')
(7275.0, 'Low Utilization')
(7278.0, 'Low Utilization')
(7280.0, 'Low Utilization')
(7282.0, 'Low Utilization')
(7297.0, 'Low Utilization')
(7301.0, 'Low Utilization')
(7302.0, 'Low Utilization')
(7320.0, 'Low Utilization')
(7329.0, 'Low Utilization')
(7331.0, 'Low Utilization')
(7332.0, 'Low Utilization')
(7333.0, 'Low Utilization')
(7334.0, 'Low Utilization')
(7335.0, 'Low Utilization')
(7336.0, 'Low Utilization')
(7339.0, 'Low Utilization')
(7340.0, 'Low Utilization')
(7343.0, 'Low Utilization')
(7344.0, 'Low Utilization')
(7345.0, 'Low Utilization')
(7347.0, 'Low Utilization')
(7348.0, 'Low Utilization')
(7350.0, 'Low Utilization')
(7354.0, 'Low Utilization')
(7355.0, 'Low Utilization')
(7356.0, 'Low Utilization')
(7357.0, 'Low Utilization')
(7358.0, 'Low Utilization')
(7359.0, 'Low Utilization')
(7360.0, 'Low Utilization')
(7362.0, 'Low Utilization')
(7363.0, 'Low Utilization')
(7365.0, 'Low Utilization')
(7366.0, 'Low Utilization')
(7368.0, 'Low Utilization')
(7377.0, 'Low Utilization')
(7379.0, 'Low Utilization')
(7389.0, 'Low Utilization')
(7392.0, 'Low Utilization')
(7394.0, 'Low Utilization')
(7396.0, 'Low Utilization')
(7399.0, 'Low Utilization')
(7400.0, 'Low Utilization')
(7401.0, 'Low Utilization')
(7402.0, 'Low Utilization')
(7406.0, 'Low Utilization')
(7411.0, 'Low Utilization')
(7412.0, 'Low Utilization')
(7413.0, 'Low Utilization')
(7415.0, 'Low Utilization')
(7416.0, 'Low Utilization')
(7417.0, 'Low Utilization')
(7418.0, 'Low Utilization')
(7423.0, 'Low Utilization')
(7425.0, 'Low Utilization')
(7428.0, 'Low Utilization')
(7434.0, 'Low Utilization')
(7436.0, 'Low Utilization')
(7438.0, 'Low Utilization')
(7446.0, 'Low Utilization')
(7450.0, 'Low Utilization')
(7451.0, 'Low Utilization')
(7452.0, 'Low Utilization')
(7454.0, 'Low Utilization')
(7455.0, 'Low Utilization')
(7457.0, 'Low Utilization')
(7458.0, 'Low Utilization')
(7459.0, 'Low Utilization')
(7474.0, 'Low Utilization')
(7476.0, 'Low Utilization')
(7478.0, 'Low Utilization')
(7479.0, 'Low Utilization')
(7480.0, 'Low Utilization')
(7485.0, 'Low Utilization')
(7486.0, 'Low Utilization')
(7487.0, 'Low Utilization')
(7488.0, 'Low Utilization')
(7497.0, 'Low Utilization')
(7498.0, 'Low Utilization')
(7500.0, 'Low Utilization')
(7502.0, 'Low Utilization')
(7503.0, 'Low Utilization')
(7505.0, 'Low Utilization')
(7506.0, 'Low Utilization')
(7507.0, 'Low Utilization')
(7508.0, 'Low Utilization')
(7509.0, 'Low Utilization')
(7510.0, 'Low Utilization')
(7512.0, 'Low Utilization')
(7514.0, 'Low Utilization')
(7519.0, 'Low Utilization')
(7520.0, 'Low Utilization')
(7522.0, 'Low Utilization')
(7527.0, 'Low Utilization')
(7528.0, 'Low Utilization')
(7529.0, 'Low Utilization')
(7532.0, 'Low Utilization')
(7533.0, 'Low Utilization')
(7534.0, 'Low Utilization')
(7536.0, 'Low Utilization')
(7537.0, 'Low Utilization')
(7538.0, 'Low Utilization')
(7539.0, 'Low Utilization')
(7541.0, 'Low Utilization')
(7542.0, 'Low Utilization')
(7545.0, 'Low Utilization')
(7547.0, 'Low Utilization')
(7548.0, 'Low Utilization')
(7549.0, 'Low Utilization')
(7550.0, 'Low Utilization')
(7551.0, 'Low Utilization')
(7552.0, 'Low Utilization')
(7553.0, 'Low Utilization')
(7554.0, 'Low Utilization')
(7556.0, 'Low Utilization')
(7557.0, 'Low Utilization')
(7558.0, 'Low Utilization')
(7559.0, 'Low Utilization')
(7560.0, 'Low Utilization')
(7561.0, 'Low Utilization')
(7563.0, 'Low Utilization')
(7566.0, 'Low Utilization')
(7568.0, 'Low Utilization')
(7569.0, 'Low Utilization')
(7570.0, 'Low Utilization')
(7571.0, 'Low Utilization')
(7572.0, 'Low Utilization')
(7575.0, 'Low Utilization')
(7576.0, 'Low Utilization')
(7577.0, 'Low Utilization')
(7579.0, 'Low Utilization')
(7584.0, 'Low Utilization')
(7586.0, 'Low Utilization')
(7591.0, 'Low Utilization')
(7592.0, 'Low Utilization')
(7593.0, 'Low Utilization')
(7594.0, 'Low Utilization')
(7595.0, 'Low Utilization')
(7596.0, 'Low Utilization')
(7603.0, 'Low Utilization')
(7605.0, 'Low Utilization')
(7606.0, 'Low Utilization')
(7607.0, 'Low Utilization')
(7608.0, 'Low Utilization')
(7610.0, 'Low Utilization')
(7611.0, 'Low Utilization')
(7612.0, 'Low Utilization')
(7614.0, 'Low Utilization')
(7615.0, 'Low Utilization')
(7621.0, 'Low Utilization')
(7622.0, 'Low Utilization')
(7623.0, 'Low Utilization')
(7624.0, 'Low Utilization')
(7625.0, 'Low Utilization')
(7626.0, 'Low Utilization')
(7627.0, 'Low Utilization')
(7628.0, 'Low Utilization')
(7630.0, 'Low Utilization')
(7631.0, 'Low Utilization')
(7633.0, 'Low Utilization')
(7634.0, 'Low Utilization')
(7635.0, 'Low Utilization')
(7636.0, 'Low Utilization')
(7637.0, 'Low Utilization')
(7638.0, 'Low Utilization')
(7639.0, 'Low Utilization')
(7640.0, 'Low Utilization')
(7642.0, 'Low Utilization')
(7643.0, 'Low Utilization')
(7644.0, 'Low Utilization')
(7645.0, 'Low Utilization')
(7646.0, 'Low Utilization')
(7647.0, 'Low Utilization')
(7648.0, 'Low Utilization')
(7649.0, 'Low Utilization')
(7659.0, 'Low Utilization')
(7660.0, 'Low Utilization')
(7672.0, 'Low Utilization')
(7674.0, 'Low Utilization')
(7676.0, 'Low Utilization')
(7686.0, 'Low Utilization')
(7689.0, 'Low Utilization')
(7690.0, 'Low Utilization')
(7692.0, 'Low Utilization')
(7695.0, 'Low Utilization')
(7696.0, 'Low Utilization')
(7697.0, 'Low Utilization')
(7705.0, 'Low Utilization')
(7706.0, 'Low Utilization')
(7708.0, 'Low Utilization')
(7712.0, 'Low Utilization')
(7716.0, 'Low Utilization')
(7718.0, 'Low Utilization')
(7719.0, 'Low Utilization')
(7720.0, 'Low Utilization')
(7721.0, 'Low Utilization')
(7722.0, 'Low Utilization')
(7725.0, 'Low Utilization')
(7726.0, 'Low Utilization')
(7727.0, 'Low Utilization')
(7728.0, 'Low Utilization')
(7733.0, 'Low Utilization')
(7739.0, 'Low Utilization')
(7740.0, 'Low Utilization')
(7748.0, 'Low Utilization')
(7752.0, 'Low Utilization')
(7753.0, 'Low Utilization')
(7757.0, 'Low Utilization')
(7762.0, 'Low Utilization')
(7763.0, 'Low Utilization')
(7764.0, 'Low Utilization')
(7765.0, 'Low Utilization')
(7766.0, 'Low Utilization')
(7767.0, 'Low Utilization')
(7768.0, 'Low Utilization')
(7769.0, 'Low Utilization')
(7770.0, 'Low Utilization')
(7772.0, 'Low Utilization')
(7779.0, 'Low Utilization')
(7780.0, 'Low Utilization')
(7792.0, 'Low Utilization')
(7800.0, 'Low Utilization')
(7910.0, 'Low Utilization')
(7922.0, 'Low Utilization')
(7923.0, 'Low Utilization')
(7924.0, 'Low Utilization')
(7930.0, 'Low Utilization')
(7936.0, 'Low Utilization')
(7938.0, 'Low Utilization')
(7939.0, 'Low Utilization')
(7948.0, 'Low Utilization')
(7949.0, 'Low Utilization')
(7951.0, 'Low Utilization')
(7952.0, 'Low Utilization')
(7981.0, 'Low Utilization')
(7985.0, 'Low Utilization')
(7986.0, 'Low Utilization')
(7988.0, 'Low Utilization')
(7993.0, 'Low Utilization')
(7995.0, 'Low Utilization')

Query 5: Rank Results (ORDER BY)

Query 6: Common Table Expressions (CTE)

Query 7: Analytical Functions
(None, '2023-04-13T18:30:06+00:00', 'Unoccupied', 1, 214, None)
(None, '2023-04-22T06:44:59+00:00', 'Present', 2, 213, 'Unoccupied')
(None, '2023-09-07T02:03:53+00:00', 'Unoccupied', 3, 212, 'Present')
(None, '2023-10-09T22:08:05+00:00', 'Unoccupied', 4, 211, 'Unoccupied')
(None, '2023-10-09T22:14:12+00:00', 'Unoccupied', 5, 210, 'Unoccupied')
(None, '2023-10-11T00:29:34+00:00', 'Unoccupied', 6, 209, 'Unoccupied')
(None, '2023-10-17T21:26:07+00:00', 'Unoccupied', 7, 208, 'Unoccupied')
(None, '2023-10-18T15:10:16+00:00', 'Unoccupied', 8, 207, 'Unoccupied')
(None, '2023-10-24T22:53:30+00:00', 'Unoccupied', 9, 206, 'Unoccupied')
(None, '2023-10-25T22:25:42+00:00', 'Unoccupied', 10, 205, 'Unoccupied')
(None, '2023-10-26T01:13:49+00:00', 'Unoccupied', 11, 204, 'Unoccupied')
(None, '2023-10-29T14:33:10+00:00', 'Unoccupied', 12, 203, 'Unoccupied')
(None, '2023-10-29T21:38:27+00:00', 'Present', 13, 202, 'Unoccupied')
(None, '2023-10-31T06:09:48+00:00', 'Present', 14, 201, 'Present')
(None, '2023-10-31T06:14:14+00:00', 'Present', 15, 200, 'Present')
(None, '2023-11-01T05:28:27+00:00', 'Present', 16, 199, 'Present')
(None, '2023-11-01T06:52:53+00:00', 'Unoccupied', 17, 198, 'Present')
(None, '2023-11-01T08:03:55+00:00', 'Present', 18, 197, 'Unoccupied')
(None, '2023-11-01T08:12:51+00:00', 'Present', 19, 196, 'Present')
(None, '2023-11-14T01:08:17+00:00', 'Present', 20, 195, 'Present')
(None, '2023-11-26T23:27:29+00:00', 'Unoccupied', 21, 194, 'Present')
(None, '2023-11-26T23:34:44+00:00', 'Present', 22, 193, 'Unoccupied')
(None, '2023-11-28T23:35:32+00:00', 'Present', 23, 192, 'Present')
(None, '2023-11-29T00:28:36+00:00', 'Present', 24, 191, 'Present')
(None, '2023-11-29T01:09:00+00:00', 'Unoccupied', 25, 190, 'Present')
(None, '2023-12-03T20:55:25+00:00', 'Present', 26, 189, 'Unoccupied')
(None, '2023-12-12T12:15:02+00:00', 'Unoccupied', 27, 188, 'Present')
(None, '2023-12-13T07:44:31+00:00', 'Unoccupied', 28, 187, 'Unoccupied')
(None, '2023-12-27T22:08:39+00:00', 'Present', 29, 186, 'Unoccupied')
(None, '2024-02-01T02:17:34+00:00', 'Present', 30, 185, 'Present')
(None, '2024-02-01T23:20:18+00:00', 'Unoccupied', 31, 184, 'Present')
(None, '2024-02-02T05:06:41+00:00', 'Unoccupied', 32, 183, 'Unoccupied')
(None, '2024-02-07T01:18:31+00:00', 'Unoccupied', 33, 182, 'Unoccupied')
(None, '2024-02-08T23:49:12+00:00', 'Present', 34, 181, 'Unoccupied')
(None, '2024-02-20T11:36:28+00:00', 'Present', 35, 180, 'Present')
(None, '2024-02-20T21:22:59+00:00', 'Unoccupied', 36, 179, 'Present')
(None, '2024-02-20T21:29:22+00:00', 'Present', 37, 178, 'Unoccupied')
(None, '2024-02-20T21:29:26+00:00', 'Present', 38, 177, 'Present')
(None, '2024-02-29T02:18:20+00:00', 'Present', 39, 176, 'Present')
(None, '2024-03-04T22:38:35+00:00', 'Present', 40, 175, 'Present')
(None, '2024-03-06T20:13:57+00:00', 'Present', 41, 174, 'Present')
(None, '2024-03-13T02:40:22+00:00', 'Present', 42, 173, 'Present')
(None, '2024-03-26T11:45:29+00:00', 'Unoccupied', 43, 172, 'Present')
(None, '2024-03-29T10:08:17+00:00', 'Unoccupied', 44, 171, 'Unoccupied')
(None, '2024-03-29T11:19:10+00:00', 'Unoccupied', 45, 170, 'Unoccupied')
(None, '2024-03-31T03:33:12+00:00', 'Present', 46, 169, 'Unoccupied')
(None, '2024-03-31T04:57:08+00:00', 'Present', 47, 168, 'Present')
(None, '2024-03-31T05:05:44+00:00', 'Present', 48, 167, 'Present')
(None, '2024-03-31T12:33:16+00:00', 'Present', 49, 166, 'Present')
(None, '2024-04-02T03:03:39+00:00', 'Unoccupied', 50, 165, 'Present')
(None, '2024-04-02T21:51:04+00:00', 'Present', 51, 164, 'Unoccupied')
(None, '2024-04-02T22:05:03+00:00', 'Present', 52, 163, 'Present')
(None, '2024-04-03T22:46:42+00:00', 'Present', 53, 162, 'Present')
(None, '2024-04-05T00:59:08+00:00', 'Unoccupied', 54, 161, 'Present')
(None, '2024-04-05T01:25:45+00:00', 'Unoccupied', 55, 160, 'Unoccupied')
(None, '2024-04-05T01:57:23+00:00', 'Unoccupied', 56, 159, 'Unoccupied')
(None, '2024-04-05T02:02:39+00:00', 'Unoccupied', 57, 158, 'Unoccupied')
(None, '2024-04-05T07:04:00+00:00', 'Unoccupied', 58, 157, 'Unoccupied')
(None, '2024-04-16T21:12:37+00:00', 'Unoccupied', 59, 156, 'Unoccupied')
(None, '2024-05-03T02:55:43+00:00', 'Unoccupied', 60, 155, 'Unoccupied')
(None, '2024-05-03T03:56:57+00:00', 'Unoccupied', 61, 154, 'Unoccupied')
(None, '2024-05-03T04:14:25+00:00', 'Unoccupied', 62, 153, 'Unoccupied')
(None, '2024-05-03T04:21:09+00:00', 'Unoccupied', 63, 152, 'Unoccupied')
(None, '2024-05-03T04:23:17+00:00', 'Unoccupied', 64, 151, 'Unoccupied')
(None, '2024-05-06T22:34:13+00:00', 'Unoccupied', 65, 150, 'Unoccupied')
(None, '2024-05-15T01:23:20+00:00', 'Unoccupied', 66, 149, 'Unoccupied')
(None, '2024-05-15T01:26:23+00:00', 'Unoccupied', 67, 148, 'Unoccupied')
(None, '2024-05-15T04:03:10+00:00', 'Present', 68, 147, 'Unoccupied')
(None, '2024-06-27T07:26:45+00:00', 'Unoccupied', 69, 146, 'Present')
(None, '2024-10-11T05:45:20+00:00', 'Unoccupied', 70, 145, 'Unoccupied')
(None, '2024-11-28T05:38:05+00:00', 'Unoccupied', 71, 144, 'Unoccupied')
(None, '2024-11-29T12:39:27+00:00', 'Unoccupied', 72, 143, 'Unoccupied')
(None, '2024-12-06T00:19:48+00:00', 'Unoccupied', 73, 142, 'Unoccupied')
(None, '2024-12-06T00:43:41+00:00', 'Unoccupied', 74, 141, 'Unoccupied')
(None, '2024-12-07T10:09:27+00:00', 'Present', 75, 140, 'Unoccupied')
(None, '2024-12-07T11:43:23+00:00', 'Unoccupied', 76, 139, 'Present')
(None, '2024-12-08T01:35:41+00:00', 'Present', 77, 138, 'Unoccupied')
(None, '2024-12-08T01:54:48+00:00', 'Unoccupied', 78, 137, 'Present')
(None, '2024-12-08T02:13:23+00:00', 'Unoccupied', 79, 136, 'Unoccupied')
(None, '2024-12-08T02:21:59+00:00', 'Present', 80, 135, 'Unoccupied')
(None, '2024-12-08T02:43:58+00:00', 'Unoccupied', 81, 134, 'Present')
(None, '2024-12-08T02:49:42+00:00', 'Unoccupied', 82, 133, 'Unoccupied')
(None, '2024-12-08T02:51:02+00:00', 'Unoccupied', 83, 132, 'Unoccupied')
(None, '2024-12-08T03:24:41+00:00', 'Present', 84, 131, 'Unoccupied')
(None, '2024-12-08T03:45:13+00:00', 'Present', 85, 130, 'Present')
(None, '2024-12-08T04:31:49+00:00', 'Present', 86, 129, 'Present')
(None, '2024-12-08T04:36:25+00:00', 'Present', 87, 128, 'Present')
(None, '2024-12-08T04:46:33+00:00', 'Unoccupied', 88, 127, 'Present')
(None, '2024-12-08T04:59:59+00:00', 'Unoccupied', 89, 126, 'Unoccupied')
(None, '2024-12-08T05:01:40+00:00', 'Unoccupied', 90, 125, 'Unoccupied')
(None, '2024-12-08T05:12:38+00:00', 'Unoccupied', 91, 124, 'Unoccupied')
(None, '2024-12-08T05:20:45+00:00', 'Unoccupied', 92, 123, 'Unoccupied')
(None, '2024-12-08T05:36:39+00:00', 'Unoccupied', 93, 122, 'Unoccupied')
(None, '2024-12-08T05:59:18+00:00', 'Present', 94, 121, 'Unoccupied')
(None, '2024-12-08T06:00:52+00:00', 'Present', 95, 120, 'Present')
(None, '2024-12-08T06:27:37+00:00', 'Present', 96, 119, 'Present')
(None, '2024-12-08T06:27:39+00:00', 'Present', 97, 118, 'Present')
(None, '2024-12-08T06:41:15+00:00', 'Unoccupied', 98, 117, 'Present')
(None, '2024-12-08T07:08:56+00:00', 'Present', 99, 116, 'Unoccupied')
(None, '2024-12-08T07:13:12+00:00', 'Present', 100, 115, 'Present')
(None, '2024-12-08T07:14:24+00:00', 'Present', 101, 114, 'Present')
(None, '2024-12-08T07:19:29+00:00', 'Unoccupied', 102, 113, 'Present')
(None, '2024-12-08T07:25:42+00:00', 'Present', 103, 112, 'Unoccupied')
(None, '2024-12-08T07:28:20+00:00', 'Present', 104, 111, 'Present')
(None, '2024-12-08T07:38:39+00:00', 'Present', 105, 110, 'Present')
(None, '2024-12-08T07:42:08+00:00', 'Present', 106, 109, 'Present')
(None, '2024-12-08T07:54:36+00:00', 'Unoccupied', 107, 108, 'Present')
(None, '2024-12-08T07:56:49+00:00', 'Unoccupied', 108, 107, 'Unoccupied')
(None, '2024-12-08T08:02:50+00:00', 'Present', 109, 106, 'Unoccupied')
(None, '2024-12-08T08:03:46+00:00', 'Present', 110, 105, 'Present')
(None, '2024-12-08T08:07:55+00:00', 'Present', 111, 104, 'Present')
(None, '2024-12-08T08:09:08+00:00', 'Present', 112, 103, 'Present')
(None, '2024-12-08T08:10:32+00:00', 'Unoccupied', 113, 102, 'Present')
(None, '2024-12-08T08:12:53+00:00', 'Present', 114, 101, 'Unoccupied')
(None, '2024-12-08T08:15:35+00:00', 'Present', 115, 100, 'Present')
(None, '2024-12-08T08:22:23+00:00', 'Present', 116, 99, 'Present')
(None, '2024-12-08T08:31:42+00:00', 'Unoccupied', 117, 98, 'Present')
(None, '2024-12-08T08:35:57+00:00', 'Present', 118, 97, 'Unoccupied')
(None, '2024-12-08T08:36:28+00:00', 'Unoccupied', 119, 96, 'Present')
(None, '2024-12-08T08:37:28+00:00', 'Unoccupied', 120, 95, 'Unoccupied')
(None, '2024-12-08T08:39:03+00:00', 'Present', 121, 94, 'Unoccupied')
(None, '2024-12-08T08:56:19+00:00', 'Present', 122, 93, 'Present')
(None, '2024-12-08T08:56:32+00:00', 'Present', 123, 92, 'Present')
(None, '2024-12-08T08:59:07+00:00', 'Present', 124, 91, 'Present')
(None, '2024-12-08T09:03:07+00:00', 'Present', 125, 89, 'Present')
(None, '2024-12-08T09:03:07+00:00', 'Unoccupied', 126, 89, 'Present')
(None, '2024-12-08T09:04:14+00:00', 'Present', 127, 88, 'Unoccupied')
(None, '2024-12-08T09:05:24+00:00', 'Present', 128, 87, 'Present')
(None, '2024-12-08T09:06:02+00:00', 'Present', 129, 86, 'Present')
(None, '2024-12-08T09:07:27+00:00', 'Present', 130, 85, 'Present')
(None, '2024-12-08T09:07:43+00:00', 'Present', 131, 84, 'Present')
(None, '2024-12-08T09:09:25+00:00', 'Unoccupied', 132, 83, 'Present')
(None, '2024-12-08T09:09:44+00:00', 'Present', 133, 82, 'Unoccupied')
(None, '2024-12-08T09:10:37+00:00', 'Present', 134, 81, 'Present')
(None, '2024-12-08T09:10:44+00:00', 'Unoccupied', 135, 80, 'Present')
(None, '2024-12-08T09:10:56+00:00', 'Present', 136, 79, 'Unoccupied')
(None, '2024-12-08T09:11:11+00:00', 'Present', 137, 78, 'Present')
(None, '2024-12-08T09:11:49+00:00', 'Present', 138, 77, 'Present')
(None, '2024-12-08T09:13:47+00:00', 'Present', 139, 76, 'Present')
(None, '2024-12-08T09:16:42+00:00', 'Present', 140, 75, 'Present')
(None, '2024-12-08T09:18:43+00:00', 'Unoccupied', 141, 74, 'Present')
(None, '2024-12-08T09:23:06+00:00', 'Unoccupied', 142, 73, 'Unoccupied')
(None, '2024-12-08T09:30:31+00:00', 'Present', 143, 72, 'Unoccupied')
(None, '2024-12-08T09:30:44+00:00', 'Present', 144, 71, 'Present')
(None, '2024-12-08T09:31:02+00:00', 'Unoccupied', 145, 70, 'Present')
(None, '2024-12-08T09:31:44+00:00', 'Unoccupied', 146, 69, 'Unoccupied')
(None, '2024-12-08T09:33:12+00:00', 'Unoccupied', 147, 68, 'Unoccupied')
(None, '2024-12-08T09:33:42+00:00', 'Present', 148, 67, 'Unoccupied')
(None, '2024-12-08T09:35:16+00:00', 'Present', 149, 66, 'Present')
(None, '2024-12-08T09:35:19+00:00', 'Present', 150, 65, 'Present')
(None, '2024-12-08T09:35:38+00:00', 'Present', 151, 64, 'Present')
(None, '2024-12-08T09:36:00+00:00', 'Unoccupied', 152, 63, 'Present')
(None, '2024-12-08T09:36:04+00:00', 'Present', 153, 62, 'Unoccupied')
(None, '2024-12-08T09:37:55+00:00', 'Unoccupied', 154, 61, 'Present')
(None, '2024-12-08T09:38:55+00:00', 'Present', 155, 60, 'Unoccupied')
(None, '2024-12-08T09:39:29+00:00', 'Unoccupied', 156, 59, 'Present')
(None, '2024-12-08T09:39:39+00:00', 'Present', 157, 58, 'Unoccupied')
(None, '2024-12-08T09:40:47+00:00', 'Present', 158, 57, 'Present')
(None, '2024-12-08T09:41:47+00:00', 'Unoccupied', 159, 56, 'Present')
(None, '2024-12-08T09:42:22+00:00', 'Unoccupied', 160, 55, 'Unoccupied')
(None, '2024-12-08T09:45:45+00:00', 'Present', 161, 54, 'Unoccupied')
(None, '2024-12-08T09:45:57+00:00', 'Present', 162, 53, 'Present')
(None, '2024-12-08T09:46:46+00:00', 'Unoccupied', 163, 52, 'Present')
(None, '2024-12-08T09:46:47+00:00', 'Unoccupied', 164, 51, 'Unoccupied')
(None, '2024-12-08T09:46:49+00:00', 'Unoccupied', 165, 50, 'Unoccupied')
(None, '2024-12-08T09:46:58+00:00', 'Present', 166, 49, 'Unoccupied')
(None, '2024-12-08T09:48:17+00:00', 'Unoccupied', 167, 48, 'Present')
(None, '2024-12-08T09:50:45+00:00', 'Unoccupied', 168, 47, 'Unoccupied')
(None, '2024-12-08T09:51:00+00:00', 'Unoccupied', 169, 46, 'Unoccupied')
(None, '2024-12-08T09:51:15+00:00', 'Present', 170, 45, 'Unoccupied')
(None, '2024-12-08T09:53:37+00:00', 'Unoccupied', 171, 44, 'Present')
(None, '2024-12-08T09:54:50+00:00', 'Unoccupied', 172, 43, 'Unoccupied')
(None, '2024-12-08T09:57:04+00:00', 'Present', 173, 42, 'Unoccupied')
(None, '2024-12-08T09:57:07+00:00', 'Present', 174, 41, 'Present')
(None, '2024-12-08T09:58:59+00:00', 'Unoccupied', 175, 40, 'Present')
(None, '2024-12-08T10:03:42+00:00', 'Unoccupied', 176, 39, 'Unoccupied')
(None, '2024-12-08T10:04:36+00:00', 'Present', 177, 38, 'Unoccupied')
(None, '2024-12-08T10:05:30+00:00', 'Present', 178, 36, 'Present')
(None, '2024-12-08T10:05:30+00:00', 'Present', 179, 36, 'Present')
(None, '2024-12-08T10:06:29+00:00', 'Unoccupied', 180, 35, 'Present')
(None, '2024-12-08T10:06:30+00:00', 'Present', 181, 34, 'Unoccupied')
(None, '2024-12-08T10:06:46+00:00', 'Present', 182, 33, 'Present')
(None, '2024-12-08T10:08:28+00:00', 'Unoccupied', 183, 32, 'Present')
(None, '2024-12-08T10:10:04+00:00', 'Present', 184, 31, 'Unoccupied')
(None, '2024-12-08T10:11:56+00:00', 'Unoccupied', 185, 30, 'Present')
(None, '2024-12-08T10:15:29+00:00', 'Present', 186, 29, 'Unoccupied')
(None, '2024-12-08T10:15:34+00:00', 'Present', 187, 28, 'Present')
(None, '2024-12-08T10:16:14+00:00', 'Present', 188, 27, 'Present')
(None, '2024-12-08T10:17:41+00:00', 'Present', 189, 26, 'Present')
(None, '2024-12-08T10:17:55+00:00', 'Unoccupied', 190, 25, 'Present')
(None, '2024-12-08T10:18:03+00:00', 'Unoccupied', 191, 24, 'Unoccupied')
(None, '2024-12-08T10:18:43+00:00', 'Unoccupied', 192, 23, 'Unoccupied')
(None, '2024-12-08T10:18:56+00:00', 'Unoccupied', 193, 22, 'Unoccupied')
(None, '2024-12-08T10:19:50+00:00', 'Unoccupied', 194, 21, 'Unoccupied')
(None, '2024-12-08T10:19:55+00:00', 'Present', 195, 20, 'Unoccupied')
(None, '2024-12-08T10:19:57+00:00', 'Unoccupied', 196, 19, 'Present')
(None, '2024-12-08T10:20:13+00:00', 'Present', 197, 18, 'Unoccupied')
(None, '2024-12-08T10:21:10+00:00', 'Unoccupied', 198, 17, 'Present')
(None, '2024-12-08T10:21:29+00:00', 'Present', 199, 16, 'Unoccupied')
(None, '2024-12-08T10:22:21+00:00', 'Present', 200, 15, 'Present')
(None, '2024-12-08T10:23:02+00:00', 'Present', 201, 14, 'Present')
(None, '2024-12-08T10:23:36+00:00', 'Present', 202, 13, 'Present')
(None, '2024-12-08T10:23:47+00:00', 'Unoccupied', 203, 12, 'Present')
(None, '2024-12-08T10:24:28+00:00', 'Unoccupied', 204, 11, 'Unoccupied')
(None, '2024-12-08T10:24:54+00:00', 'Present', 205, 10, 'Unoccupied')
(None, '2024-12-08T10:25:22+00:00', 'Unoccupied', 206, 9, 'Present')
(None, '2024-12-08T10:26:11+00:00', 'Unoccupied', 207, 8, 'Unoccupied')
(None, '2024-12-08T10:27:30+00:00', 'Present', 208, 7, 'Unoccupied')
(None, '2024-12-08T10:28:04+00:00', 'Unoccupied', 209, 6, 'Present')
(None, '2024-12-08T10:28:45+00:00', 'Unoccupied', 210, 5, 'Unoccupied')
(None, '2024-12-08T10:28:52+00:00', 'Present', 211, 4, 'Unoccupied')
(None, '2024-12-08T10:29:31+00:00', 'Unoccupied', 212, 3, 'Present')
(None, '2024-12-08T10:30:09+00:00', 'Present', 213, 2, 'Unoccupied')
(None, '2024-12-08T10:30:15+00:00', 'Present', 214, 1, 'Present')
(7010.0, '2024-10-10T21:40:32+00:00', 'Present', 1, 9, None)
(7010.0, '2024-10-10T21:54:36+00:00', 'Present', 2, 8, 'Present')
(7010.0, '2024-10-10T22:38:32+00:00', 'Present', 3, 7, 'Present')
(7010.0, '2024-10-10T22:53:01+00:00', 'Present', 4, 6, 'Present')
(7010.0, '2024-10-10T23:16:06+00:00', 'Present', 5, 5, 'Present')
(7010.0, '2024-10-10T23:18:56+00:00', 'Present', 6, 4, 'Present')
(7010.0, '2024-10-10T23:53:04+00:00', 'Present', 7, 3, 'Present')
(7010.0, '2024-10-11T01:22:53+00:00', 'Unoccupied', 8, 2, 'Present')
(7010.0, '2024-12-08T04:21:34+00:00', 'Present', 9, 1, 'Unoccupied')
(7014.0, '2023-11-15T22:32:31+00:00', 'Present', 1, 4, None)
(7014.0, '2023-11-16T04:05:33+00:00', 'Present', 2, 3, 'Present')
(7014.0, '2023-11-16T04:26:56+00:00', 'Present', 3, 2, 'Present')
(7014.0, '2023-11-16T05:02:04+00:00', 'Present', 4, 1, 'Present')
(7018.0, '2024-06-20T22:03:59+00:00', 'Present', 1, 3, None)
(7018.0, '2024-12-06T01:22:20+00:00', 'Unoccupied', 2, 2, 'Present')
(7018.0, '2024-12-06T01:42:44+00:00', 'Unoccupied', 3, 1, 'Unoccupied')
(7019.0, '2023-08-15T22:08:51+00:00', 'Present', 1, 1, None)
(7025.0, '2023-04-04T09:56:48+00:00', 'Present', 1, 8, None)
(7025.0, '2023-04-04T13:30:12+00:00', 'Unoccupied', 2, 7, 'Present')
(7025.0, '2023-04-04T13:32:01+00:00', 'Unoccupied', 3, 6, 'Unoccupied')
(7025.0, '2023-08-10T00:49:15+00:00', 'Present', 4, 5, 'Unoccupied')
(7025.0, '2023-08-13T22:48:24+00:00', 'Unoccupied', 5, 4, 'Present')
(7025.0, '2023-08-13T22:50:04+00:00', 'Unoccupied', 6, 3, 'Unoccupied')
(7025.0, '2023-08-13T22:50:13+00:00', 'Present', 7, 2, 'Unoccupied')
(7025.0, '2023-08-16T05:21:40+00:00', 'Unoccupied', 8, 1, 'Present')
(7049.0, '2024-10-04T19:28:53+00:00', 'Present', 1, 13, None)
(7049.0, '2024-11-09T02:50:54+00:00', 'Unoccupied', 2, 12, 'Present')
(7049.0, '2024-11-29T15:23:35+00:00', 'Present', 3, 11, 'Unoccupied')
(7049.0, '2024-12-04T11:44:06+00:00', 'Present', 4, 10, 'Present')
(7049.0, '2024-12-05T07:39:00+00:00', 'Present', 5, 9, 'Present')
(7049.0, '2024-12-06T23:37:17+00:00', 'Present', 6, 8, 'Present')
(7049.0, '2024-12-07T03:34:40+00:00', 'Present', 7, 7, 'Present')
(7049.0, '2024-12-08T01:53:50+00:00', 'Unoccupied', 8, 6, 'Present')
(7049.0, '2024-12-08T03:30:51+00:00', 'Present', 9, 5, 'Unoccupied')
(7049.0, '2024-12-08T04:53:11+00:00', 'Present', 10, 4, 'Present')
(7049.0, '2024-12-08T05:16:49+00:00', 'Present', 11, 3, 'Present')
(7049.0, '2024-12-08T09:47:00+00:00', 'Present', 12, 2, 'Present')
(7049.0, '2024-12-08T09:54:01+00:00', 'Unoccupied', 13, 1, 'Present')
(7053.0, '2024-12-02T08:20:03+00:00', 'Present', 1, 13, None)
(7053.0, '2024-12-05T00:21:59+00:00', 'Present', 2, 12, 'Present')
(7053.0, '2024-12-06T06:10:23+00:00', 'Present', 3, 11, 'Present')
(7053.0, '2024-12-07T06:46:24+00:00', 'Present', 4, 10, 'Present')
(7053.0, '2024-12-07T07:50:04+00:00', 'Present', 5, 9, 'Present')
(7053.0, '2024-12-07T23:54:41+00:00', 'Present', 6, 8, 'Present')
(7053.0, '2024-12-08T01:55:48+00:00', 'Present', 7, 7, 'Present')
(7053.0, '2024-12-08T04:44:02+00:00', 'Present', 8, 6, 'Present')
(7053.0, '2024-12-08T06:31:51+00:00', 'Present', 9, 5, 'Present')
(7053.0, '2024-12-08T08:05:57+00:00', 'Unoccupied', 10, 4, 'Present')
(7053.0, '2024-12-08T09:07:08+00:00', 'Present', 11, 3, 'Unoccupied')
(7053.0, '2024-12-08T09:19:26+00:00', 'Unoccupied', 12, 2, 'Present')
(7053.0, '2024-12-08T10:06:30+00:00', 'Unoccupied', 13, 1, 'Unoccupied')
(7076.0, '2024-03-19T08:55:33+00:00', 'Unoccupied', 1, 19, None)
(7076.0, '2024-03-20T21:59:45+00:00', 'Unoccupied', 2, 18, 'Unoccupied')
(7076.0, '2024-03-20T22:03:53+00:00', 'Present', 3, 17, 'Unoccupied')
(7076.0, '2024-03-21T11:18:01+00:00', 'Unoccupied', 4, 16, 'Present')
(7076.0, '2024-04-03T17:30:32+00:00', 'Unoccupied', 5, 15, 'Unoccupied')
(7076.0, '2024-04-03T20:40:58+00:00', 'Unoccupied', 6, 14, 'Unoccupied')
(7076.0, '2024-04-03T23:19:41+00:00', 'Present', 7, 13, 'Unoccupied')
(7076.0, '2024-04-04T21:26:28+00:00', 'Present', 8, 12, 'Present')
(7076.0, '2024-04-04T23:21:26+00:00', 'Present', 9, 11, 'Present')
(7076.0, '2024-04-05T00:54:15+00:00', 'Present', 10, 10, 'Present')
(7076.0, '2024-04-05T01:51:37+00:00', 'Unoccupied', 11, 9, 'Present')
(7076.0, '2024-04-05T01:57:01+00:00', 'Present', 12, 8, 'Unoccupied')
(7076.0, '2024-04-05T02:09:27+00:00', 'Unoccupied', 13, 7, 'Present')
(7076.0, '2024-04-05T02:15:01+00:00', 'Present', 14, 6, 'Unoccupied')
(7076.0, '2024-04-05T02:25:10+00:00', 'Unoccupied', 15, 5, 'Present')
(7076.0, '2024-04-05T02:35:00+00:00', 'Present', 16, 4, 'Unoccupied')
(7076.0, '2024-04-05T02:35:09+00:00', 'Present', 17, 3, 'Present')
(7076.0, '2024-04-05T02:36:16+00:00', 'Present', 18, 2, 'Present')
(7076.0, '2024-04-05T02:39:10+00:00', 'Present', 19, 1, 'Present')
(7081.0, '2024-04-25T15:56:07+00:00', 'Unoccupied', 1, 5, None)
(7081.0, '2024-06-16T21:36:41+00:00', 'Unoccupied', 2, 4, 'Unoccupied')
(7081.0, '2024-12-08T01:48:52+00:00', 'Present', 3, 3, 'Unoccupied')
(7081.0, '2024-12-08T09:35:37+00:00', 'Present', 4, 2, 'Present')
(7081.0, '2024-12-08T10:29:37+00:00', 'Present', 5, 1, 'Present')
(7084.0, '2024-10-19T11:10:53+00:00', 'Unoccupied', 1, 27, None)
(7084.0, '2024-10-19T13:31:32+00:00', 'Unoccupied', 2, 26, 'Unoccupied')
(7084.0, '2024-10-19T13:31:48+00:00', 'Unoccupied', 3, 25, 'Unoccupied')
(7084.0, '2024-11-27T06:31:45+00:00', 'Unoccupied', 4, 24, 'Unoccupied')
(7084.0, '2024-11-27T08:40:20+00:00', 'Unoccupied', 5, 23, 'Unoccupied')
(7084.0, '2024-11-27T10:09:44+00:00', 'Unoccupied', 6, 22, 'Unoccupied')
(7084.0, '2024-11-27T17:25:40+00:00', 'Unoccupied', 7, 21, 'Unoccupied')
(7084.0, '2024-11-27T22:25:48+00:00', 'Unoccupied', 8, 20, 'Unoccupied')
(7084.0, '2024-11-27T23:23:40+00:00', 'Unoccupied', 9, 19, 'Unoccupied')
(7084.0, '2024-11-28T01:08:40+00:00', 'Present', 10, 18, 'Unoccupied')
(7084.0, '2024-11-28T01:15:59+00:00', 'Unoccupied', 11, 17, 'Present')
(7084.0, '2024-11-28T02:00:16+00:00', 'Present', 12, 16, 'Unoccupied')
(7084.0, '2024-11-28T02:06:51+00:00', 'Unoccupied', 13, 15, 'Present')
(7084.0, '2024-11-28T02:22:55+00:00', 'Present', 14, 14, 'Unoccupied')
(7084.0, '2024-11-28T02:30:57+00:00', 'Present', 15, 13, 'Present')
(7084.0, '2024-11-28T02:31:34+00:00', 'Present', 16, 12, 'Present')
(7084.0, '2024-11-28T02:31:41+00:00', 'Unoccupied', 17, 11, 'Present')
(7084.0, '2024-11-28T02:32:55+00:00', 'Unoccupied', 18, 10, 'Unoccupied')
(7084.0, '2024-11-28T02:40:31+00:00', 'Unoccupied', 19, 9, 'Unoccupied')
(7084.0, '2024-11-28T02:50:49+00:00', 'Present', 20, 8, 'Unoccupied')
(7084.0, '2024-11-28T02:53:41+00:00', 'Unoccupied', 21, 7, 'Present')
(7084.0, '2024-11-28T02:57:26+00:00', 'Unoccupied', 22, 6, 'Unoccupied')
(7084.0, '2024-11-28T02:57:41+00:00', 'Present', 23, 5, 'Unoccupied')
(7084.0, '2024-11-28T03:03:02+00:00', 'Present', 24, 4, 'Present')
(7084.0, '2024-11-28T03:14:47+00:00', 'Present', 25, 3, 'Present')
(7084.0, '2024-11-28T03:15:03+00:00', 'Unoccupied', 26, 2, 'Present')
(7084.0, '2024-11-28T03:17:09+00:00', 'Unoccupied', 27, 1, 'Unoccupied')
(7089.0, '2023-11-01T06:06:24+00:00', 'Present', 1, 7, None)
(7089.0, '2023-11-01T06:51:28+00:00', 'Present', 2, 6, 'Present')
(7089.0, '2023-11-01T07:31:48+00:00', 'Present', 3, 5, 'Present')
(7089.0, '2023-11-01T07:39:25+00:00', 'Present', 4, 4, 'Present')
(7089.0, '2023-11-01T07:49:14+00:00', 'Present', 5, 3, 'Present')
(7089.0, '2023-11-01T07:56:05+00:00', 'Present', 6, 2, 'Present')
(7089.0, '2023-11-01T08:31:13+00:00', 'Present', 7, 1, 'Present')
(7090.0, '2024-03-19T09:17:00+00:00', 'Unoccupied', 1, 1, None)
(7096.0, '2024-12-08T07:32:43+00:00', 'Present', 1, 3, None)
(7096.0, '2024-12-08T09:36:12+00:00', 'Present', 2, 2, 'Present')
(7096.0, '2024-12-08T09:41:30+00:00', 'Present', 3, 1, 'Present')
(7156.0, '2024-12-06T23:54:35+00:00', 'Present', 1, 7, None)
(7156.0, '2024-12-08T08:11:49+00:00', 'Present', 2, 6, 'Present')
(7156.0, '2024-12-08T09:41:54+00:00', 'Unoccupied', 3, 5, 'Present')
(7156.0, '2024-12-08T10:11:02+00:00', 'Unoccupied', 4, 4, 'Unoccupied')
(7156.0, '2024-12-08T10:28:04+00:00', 'Present', 5, 3, 'Unoccupied')
(7156.0, '2024-12-08T10:30:03+00:00', 'Unoccupied', 6, 2, 'Present')
(7156.0, '2024-12-08T10:31:20+00:00', 'Unoccupied', 7, 1, 'Unoccupied')
(7159.0, '2024-12-07T11:58:12+00:00', 'Present', 1, 6, None)
(7159.0, '2024-12-07T18:07:23+00:00', 'Unoccupied', 2, 5, 'Present')
(7159.0, '2024-12-08T07:40:38+00:00', 'Present', 3, 4, 'Unoccupied')
(7159.0, '2024-12-08T08:30:33+00:00', 'Present', 4, 3, 'Present')
(7159.0, '2024-12-08T10:02:47+00:00', 'Present', 5, 2, 'Present')
(7159.0, '2024-12-08T10:11:07+00:00', 'Unoccupied', 6, 1, 'Present')
(7160.0, '2024-12-08T08:59:16+00:00', 'Present', 1, 4, None)
(7160.0, '2024-12-08T09:39:03+00:00', 'Present', 2, 3, 'Present')
(7160.0, '2024-12-08T09:53:42+00:00', 'Present', 3, 2, 'Present')
(7160.0, '2024-12-08T10:15:18+00:00', 'Present', 4, 1, 'Present')
(7161.0, '2024-12-07T03:03:15+00:00', 'Unoccupied', 1, 15, None)
(7161.0, '2024-12-07T13:35:30+00:00', 'Present', 2, 14, 'Unoccupied')
(7161.0, '2024-12-08T04:13:26+00:00', 'Present', 3, 13, 'Present')
(7161.0, '2024-12-08T04:42:59+00:00', 'Unoccupied', 4, 12, 'Present')
(7161.0, '2024-12-08T06:52:57+00:00', 'Present', 5, 11, 'Unoccupied')
(7161.0, '2024-12-08T07:03:36+00:00', 'Present', 6, 10, 'Present')
(7161.0, '2024-12-08T07:14:59+00:00', 'Unoccupied', 7, 9, 'Present')
(7161.0, '2024-12-08T07:24:03+00:00', 'Present', 8, 8, 'Unoccupied')
(7161.0, '2024-12-08T07:53:00+00:00', 'Unoccupied', 9, 7, 'Present')
(7161.0, '2024-12-08T08:26:52+00:00', 'Unoccupied', 10, 6, 'Unoccupied')
(7161.0, '2024-12-08T08:46:02+00:00', 'Unoccupied', 11, 5, 'Unoccupied')
(7161.0, '2024-12-08T09:11:28+00:00', 'Present', 12, 4, 'Unoccupied')
(7161.0, '2024-12-08T09:29:37+00:00', 'Unoccupied', 13, 3, 'Present')
(7161.0, '2024-12-08T09:29:53+00:00', 'Unoccupied', 14, 2, 'Unoccupied')
(7161.0, '2024-12-08T09:30:12+00:00', 'Present', 15, 1, 'Unoccupied')
(7163.0, '2024-03-17T09:46:27+00:00', 'Unoccupied', 1, 25, None)
(7163.0, '2024-03-17T11:03:26+00:00', 'Unoccupied', 2, 24, 'Unoccupied')
(7163.0, '2024-03-17T11:03:56+00:00', 'Present', 3, 23, 'Unoccupied')
(7163.0, '2024-12-08T04:43:30+00:00', 'Present', 4, 22, 'Present')
(7163.0, '2024-12-08T05:38:23+00:00', 'Present', 5, 21, 'Present')
(7163.0, '2024-12-08T06:17:05+00:00', 'Unoccupied', 6, 20, 'Present')
(7163.0, '2024-12-08T06:46:18+00:00', 'Present', 7, 19, 'Unoccupied')
(7163.0, '2024-12-08T07:51:22+00:00', 'Present', 8, 18, 'Present')
(7163.0, '2024-12-08T07:57:57+00:00', 'Unoccupied', 9, 17, 'Present')
(7163.0, '2024-12-08T07:59:06+00:00', 'Unoccupied', 10, 16, 'Unoccupied')
(7163.0, '2024-12-08T08:13:29+00:00', 'Unoccupied', 11, 15, 'Unoccupied')
(7163.0, '2024-12-08T08:43:21+00:00', 'Unoccupied', 12, 14, 'Unoccupied')
(7163.0, '2024-12-08T08:57:18+00:00', 'Unoccupied', 13, 13, 'Unoccupied')
(7163.0, '2024-12-08T08:59:57+00:00', 'Present', 14, 12, 'Unoccupied')
(7163.0, '2024-12-08T09:04:29+00:00', 'Present', 15, 11, 'Present')
(7163.0, '2024-12-08T09:21:17+00:00', 'Present', 16, 10, 'Present')
(7163.0, '2024-12-08T09:22:02+00:00', 'Unoccupied', 17, 9, 'Present')
(7163.0, '2024-12-08T09:30:47+00:00', 'Unoccupied', 18, 8, 'Unoccupied')
(7163.0, '2024-12-08T09:38:13+00:00', 'Unoccupied', 19, 7, 'Unoccupied')
(7163.0, '2024-12-08T09:56:41+00:00', 'Unoccupied', 20, 6, 'Unoccupied')
(7163.0, '2024-12-08T10:00:50+00:00', 'Unoccupied', 21, 5, 'Unoccupied')
(7163.0, '2024-12-08T10:07:28+00:00', 'Unoccupied', 22, 4, 'Unoccupied')
(7163.0, '2024-12-08T10:17:00+00:00', 'Unoccupied', 23, 3, 'Unoccupied')
(7163.0, '2024-12-08T10:17:09+00:00', 'Present', 24, 2, 'Unoccupied')
(7163.0, '2024-12-08T10:26:43+00:00', 'Unoccupied', 25, 1, 'Present')
(7165.0, '2024-12-08T06:26:22+00:00', 'Present', 1, 8, None)
(7165.0, '2024-12-08T08:24:20+00:00', 'Present', 2, 7, 'Present')
(7165.0, '2024-12-08T08:50:58+00:00', 'Present', 3, 6, 'Present')
(7165.0, '2024-12-08T09:02:24+00:00', 'Unoccupied', 4, 5, 'Present')
(7165.0, '2024-12-08T09:35:02+00:00', 'Present', 5, 4, 'Unoccupied')
(7165.0, '2024-12-08T09:43:57+00:00', 'Unoccupied', 6, 3, 'Present')
(7165.0, '2024-12-08T10:11:28+00:00', 'Unoccupied', 7, 2, 'Unoccupied')
(7165.0, '2024-12-08T10:11:38+00:00', 'Unoccupied', 8, 1, 'Unoccupied')
(7167.0, '2024-08-08T09:36:18+00:00', 'Unoccupied', 1, 15, None)
(7167.0, '2024-09-17T00:32:11+00:00', 'Present', 2, 14, 'Unoccupied')
(7167.0, '2024-12-07T02:20:13+00:00', 'Present', 3, 13, 'Present')
(7167.0, '2024-12-07T06:58:05+00:00', 'Present', 4, 12, 'Present')
(7167.0, '2024-12-08T03:30:19+00:00', 'Present', 5, 11, 'Present')
(7167.0, '2024-12-08T05:00:40+00:00', 'Present', 6, 10, 'Present')
(7167.0, '2024-12-08T05:36:17+00:00', 'Present', 7, 9, 'Present')
(7167.0, '2024-12-08T06:26:14+00:00', 'Present', 8, 8, 'Present')
(7167.0, '2024-12-08T06:42:07+00:00', 'Present', 9, 7, 'Present')
(7167.0, '2024-12-08T06:59:06+00:00', 'Present', 10, 6, 'Present')
(7167.0, '2024-12-08T08:48:34+00:00', 'Present', 11, 5, 'Present')
(7167.0, '2024-12-08T08:48:54+00:00', 'Present', 12, 4, 'Present')
(7167.0, '2024-12-08T08:58:51+00:00', 'Present', 13, 3, 'Present')
(7167.0, '2024-12-08T09:25:04+00:00', 'Present', 14, 2, 'Present')
(7167.0, '2024-12-08T10:16:13+00:00', 'Unoccupied', 15, 1, 'Present')
(7170.0, '2024-12-08T08:06:37+00:00', 'Present', 1, 4, None)
(7170.0, '2024-12-08T08:28:41+00:00', 'Present', 2, 3, 'Present')
(7170.0, '2024-12-08T08:40:05+00:00', 'Present', 3, 2, 'Present')
(7170.0, '2024-12-08T10:18:11+00:00', 'Unoccupied', 4, 1, 'Present')
(7173.0, '2023-02-13T04:48:19+00:00', 'Unoccupied', 1, 29, None)
(7173.0, '2024-12-08T05:08:14+00:00', 'Present', 2, 28, 'Unoccupied')
(7173.0, '2024-12-08T05:44:49+00:00', 'Present', 3, 27, 'Present')
(7173.0, '2024-12-08T05:59:12+00:00', 'Present', 4, 26, 'Present')
(7173.0, '2024-12-08T06:58:39+00:00', 'Present', 5, 25, 'Present')
(7173.0, '2024-12-08T07:01:03+00:00', 'Present', 6, 24, 'Present')
(7173.0, '2024-12-08T07:02:06+00:00', 'Present', 7, 23, 'Present')
(7173.0, '2024-12-08T07:02:19+00:00', 'Present', 8, 22, 'Present')
(7173.0, '2024-12-08T07:15:38+00:00', 'Present', 9, 21, 'Present')
(7173.0, '2024-12-08T07:18:07+00:00', 'Present', 10, 20, 'Present')
(7173.0, '2024-12-08T07:19:42+00:00', 'Present', 11, 19, 'Present')
(7173.0, '2024-12-08T07:26:02+00:00', 'Present', 12, 18, 'Present')
(7173.0, '2024-12-08T07:49:04+00:00', 'Present', 13, 17, 'Present')
(7173.0, '2024-12-08T07:51:23+00:00', 'Present', 14, 16, 'Present')
(7173.0, '2024-12-08T07:52:47+00:00', 'Present', 15, 15, 'Present')
(7173.0, '2024-12-08T07:53:36+00:00', 'Present', 16, 14, 'Present')
(7173.0, '2024-12-08T07:55:05+00:00', 'Present', 17, 13, 'Present')
(7173.0, '2024-12-08T07:55:45+00:00', 'Present', 18, 12, 'Present')
(7173.0, '2024-12-08T07:59:57+00:00', 'Present', 19, 11, 'Present')
(7173.0, '2024-12-08T08:02:07+00:00', 'Present', 20, 10, 'Present')
(7173.0, '2024-12-08T08:05:08+00:00', 'Present', 21, 9, 'Present')
(7173.0, '2024-12-08T08:24:12+00:00', 'Present', 22, 8, 'Present')
(7173.0, '2024-12-08T09:53:08+00:00', 'Present', 23, 7, 'Present')
(7173.0, '2024-12-08T09:56:14+00:00', 'Present', 24, 6, 'Present')
(7173.0, '2024-12-08T10:00:13+00:00', 'Present', 25, 5, 'Present')
(7173.0, '2024-12-08T10:20:14+00:00', 'Unoccupied', 26, 4, 'Present')
(7173.0, '2024-12-08T10:23:00+00:00', 'Unoccupied', 27, 3, 'Unoccupied')
(7173.0, '2024-12-08T10:29:11+00:00', 'Unoccupied', 28, 2, 'Unoccupied')
(7173.0, '2024-12-08T10:30:21+00:00', 'Unoccupied', 29, 1, 'Unoccupied')
(7178.0, '2024-10-01T04:06:07+00:00', 'Unoccupied', 1, 39, None)
(7178.0, '2024-12-07T17:14:59+00:00', 'Present', 2, 38, 'Unoccupied')
(7178.0, '2024-12-07T18:49:01+00:00', 'Present', 3, 37, 'Present')
(7178.0, '2024-12-08T00:46:43+00:00', 'Present', 4, 36, 'Present')
(7178.0, '2024-12-08T02:23:41+00:00', 'Present', 5, 35, 'Present')
(7178.0, '2024-12-08T05:18:33+00:00', 'Present', 6, 34, 'Present')
(7178.0, '2024-12-08T05:22:01+00:00', 'Present', 7, 33, 'Present')
(7178.0, '2024-12-08T05:31:37+00:00', 'Present', 8, 32, 'Present')
(7178.0, '2024-12-08T05:54:07+00:00', 'Present', 9, 31, 'Present')
(7178.0, '2024-12-08T06:11:57+00:00', 'Present', 10, 30, 'Present')
(7178.0, '2024-12-08T06:46:32+00:00', 'Present', 11, 29, 'Present')
(7178.0, '2024-12-08T07:07:34+00:00', 'Present', 12, 28, 'Present')
(7178.0, '2024-12-08T07:13:20+00:00', 'Present', 13, 27, 'Present')
(7178.0, '2024-12-08T07:18:49+00:00', 'Present', 14, 26, 'Present')
(7178.0, '2024-12-08T07:25:55+00:00', 'Present', 15, 25, 'Present')
(7178.0, '2024-12-08T07:27:03+00:00', 'Present', 16, 24, 'Present')
(7178.0, '2024-12-08T07:30:27+00:00', 'Present', 17, 23, 'Present')
(7178.0, '2024-12-08T07:52:27+00:00', 'Present', 18, 22, 'Present')
(7178.0, '2024-12-08T08:06:08+00:00', 'Present', 19, 21, 'Present')
(7178.0, '2024-12-08T08:06:16+00:00', 'Present', 20, 20, 'Present')
(7178.0, '2024-12-08T08:23:52+00:00', 'Present', 21, 19, 'Present')
(7178.0, '2024-12-08T08:32:08+00:00', 'Present', 22, 18, 'Present')
(7178.0, '2024-12-08T09:32:54+00:00', 'Unoccupied', 23, 17, 'Present')
(7178.0, '2024-12-08T09:43:55+00:00', 'Unoccupied', 24, 16, 'Unoccupied')
(7178.0, '2024-12-08T09:48:11+00:00', 'Present', 25, 15, 'Unoccupied')
(7178.0, '2024-12-08T09:52:54+00:00', 'Unoccupied', 26, 14, 'Present')
(7178.0, '2024-12-08T09:58:17+00:00', 'Present', 27, 13, 'Unoccupied')
(7178.0, '2024-12-08T09:58:22+00:00', 'Present', 28, 12, 'Present')
(7178.0, '2024-12-08T10:01:24+00:00', 'Unoccupied', 29, 11, 'Present')
(7178.0, '2024-12-08T10:03:11+00:00', 'Unoccupied', 30, 10, 'Unoccupied')
(7178.0, '2024-12-08T10:04:06+00:00', 'Unoccupied', 31, 9, 'Unoccupied')
(7178.0, '2024-12-08T10:06:09+00:00', 'Unoccupied', 32, 8, 'Unoccupied')
(7178.0, '2024-12-08T10:13:26+00:00', 'Unoccupied', 33, 7, 'Unoccupied')
(7178.0, '2024-12-08T10:14:22+00:00', 'Unoccupied', 34, 6, 'Unoccupied')
(7178.0, '2024-12-08T10:19:00+00:00', 'Unoccupied', 35, 5, 'Unoccupied')
(7178.0, '2024-12-08T10:19:50+00:00', 'Unoccupied', 36, 4, 'Unoccupied')
(7178.0, '2024-12-08T10:20:10+00:00', 'Unoccupied', 37, 3, 'Unoccupied')
(7178.0, '2024-12-08T10:29:29+00:00', 'Unoccupied', 38, 2, 'Unoccupied')
(7178.0, '2024-12-08T10:31:10+00:00', 'Unoccupied', 39, 1, 'Unoccupied')
(7182.0, '2024-12-08T03:32:20+00:00', 'Present', 1, 3, None)
(7182.0, '2024-12-08T05:37:05+00:00', 'Present', 2, 2, 'Present')
(7182.0, '2024-12-08T09:23:26+00:00', 'Present', 3, 1, 'Present')
(7183.0, '2024-12-07T19:27:55+00:00', 'Present', 1, 9, None)
(7183.0, '2024-12-08T04:06:12+00:00', 'Present', 2, 8, 'Present')
(7183.0, '2024-12-08T04:51:09+00:00', 'Present', 3, 7, 'Present')
(7183.0, '2024-12-08T09:20:51+00:00', 'Unoccupied', 4, 6, 'Present')
(7183.0, '2024-12-08T09:20:53+00:00', 'Unoccupied', 5, 5, 'Unoccupied')
(7183.0, '2024-12-08T09:31:53+00:00', 'Unoccupied', 6, 4, 'Unoccupied')
(7183.0, '2024-12-08T09:41:38+00:00', 'Unoccupied', 7, 3, 'Unoccupied')
(7183.0, '2024-12-08T10:07:01+00:00', 'Unoccupied', 8, 2, 'Unoccupied')
(7183.0, '2024-12-08T10:14:52+00:00', 'Present', 9, 1, 'Unoccupied')
(7184.0, '2024-11-14T07:58:39+00:00', 'Unoccupied', 1, 9, None)
(7184.0, '2024-12-08T02:27:15+00:00', 'Present', 2, 8, 'Unoccupied')
(7184.0, '2024-12-08T06:59:45+00:00', 'Present', 3, 7, 'Present')
(7184.0, '2024-12-08T08:27:28+00:00', 'Present', 4, 6, 'Present')
(7184.0, '2024-12-08T09:05:05+00:00', 'Unoccupied', 5, 5, 'Present')
(7184.0, '2024-12-08T09:25:29+00:00', 'Unoccupied', 6, 4, 'Unoccupied')
(7184.0, '2024-12-08T09:55:29+00:00', 'Present', 7, 3, 'Unoccupied')
(7184.0, '2024-12-08T10:11:02+00:00', 'Unoccupied', 8, 2, 'Present')
(7184.0, '2024-12-08T10:17:01+00:00', 'Unoccupied', 9, 1, 'Unoccupied')
(7185.0, '2024-12-08T07:07:21+00:00', 'Present', 1, 3, None)
(7185.0, '2024-12-08T08:44:44+00:00', 'Unoccupied', 2, 2, 'Present')
(7185.0, '2024-12-08T09:10:12+00:00', 'Unoccupied', 3, 1, 'Unoccupied')
(7186.0, '2024-12-07T02:39:15+00:00', 'Present', 1, 21, None)
(7186.0, '2024-12-07T05:06:28+00:00', 'Present', 2, 20, 'Present')
(7186.0, '2024-12-08T03:48:23+00:00', 'Unoccupied', 3, 19, 'Present')
(7186.0, '2024-12-08T05:25:45+00:00', 'Present', 4, 18, 'Unoccupied')
(7186.0, '2024-12-08T06:24:25+00:00', 'Present', 5, 17, 'Present')
(7186.0, '2024-12-08T06:28:32+00:00', 'Present', 6, 16, 'Present')
(7186.0, '2024-12-08T06:32:10+00:00', 'Unoccupied', 7, 15, 'Present')
(7186.0, '2024-12-08T07:49:27+00:00', 'Present', 8, 14, 'Unoccupied')
(7186.0, '2024-12-08T08:05:47+00:00', 'Present', 9, 13, 'Present')
(7186.0, '2024-12-08T08:18:09+00:00', 'Present', 10, 12, 'Present')
(7186.0, '2024-12-08T08:23:32+00:00', 'Unoccupied', 11, 11, 'Present')
(7186.0, '2024-12-08T08:42:53+00:00', 'Unoccupied', 12, 10, 'Unoccupied')
(7186.0, '2024-12-08T08:56:48+00:00', 'Unoccupied', 13, 9, 'Unoccupied')
(7186.0, '2024-12-08T09:05:56+00:00', 'Unoccupied', 14, 8, 'Unoccupied')
(7186.0, '2024-12-08T09:09:11+00:00', 'Present', 15, 7, 'Unoccupied')
(7186.0, '2024-12-08T09:22:19+00:00', 'Unoccupied', 16, 6, 'Present')
(7186.0, '2024-12-08T09:22:27+00:00', 'Unoccupied', 17, 5, 'Unoccupied')
(7186.0, '2024-12-08T09:45:38+00:00', 'Unoccupied', 18, 4, 'Unoccupied')
(7186.0, '2024-12-08T09:54:42+00:00', 'Present', 19, 3, 'Unoccupied')
(7186.0, '2024-12-08T09:59:02+00:00', 'Present', 20, 2, 'Present')
(7186.0, '2024-12-08T10:01:13+00:00', 'Unoccupied', 21, 1, 'Present')
(7188.0, '2024-12-05T06:14:36+00:00', 'Unoccupied', 1, 19, None)
(7188.0, '2024-12-08T01:38:01+00:00', 'Present', 2, 18, 'Unoccupied')
(7188.0, '2024-12-08T01:49:13+00:00', 'Unoccupied', 3, 17, 'Present')
(7188.0, '2024-12-08T06:09:18+00:00', 'Present', 4, 16, 'Unoccupied')
(7188.0, '2024-12-08T06:31:20+00:00', 'Present', 5, 15, 'Present')
(7188.0, '2024-12-08T06:37:33+00:00', 'Present', 6, 14, 'Present')
(7188.0, '2024-12-08T07:48:14+00:00', 'Present', 7, 13, 'Present')
(7188.0, '2024-12-08T07:57:25+00:00', 'Present', 8, 12, 'Present')
(7188.0, '2024-12-08T08:02:55+00:00', 'Present', 9, 11, 'Present')
(7188.0, '2024-12-08T08:15:44+00:00', 'Unoccupied', 10, 10, 'Present')
(7188.0, '2024-12-08T08:30:06+00:00', 'Present', 11, 9, 'Unoccupied')
(7188.0, '2024-12-08T08:31:13+00:00', 'Present', 12, 8, 'Present')
(7188.0, '2024-12-08T08:50:08+00:00', 'Unoccupied', 13, 7, 'Present')
(7188.0, '2024-12-08T09:43:36+00:00', 'Unoccupied', 14, 6, 'Unoccupied')
(7188.0, '2024-12-08T09:46:35+00:00', 'Unoccupied', 15, 5, 'Unoccupied')
(7188.0, '2024-12-08T10:01:18+00:00', 'Present', 16, 4, 'Unoccupied')
(7188.0, '2024-12-08T10:02:30+00:00', 'Unoccupied', 17, 3, 'Present')
(7188.0, '2024-12-08T10:15:55+00:00', 'Present', 18, 2, 'Unoccupied')
(7188.0, '2024-12-08T10:25:14+00:00', 'Unoccupied', 19, 1, 'Present')
(7189.0, '2024-12-08T08:49:03+00:00', 'Present', 1, 3, None)
(7189.0, '2024-12-08T09:18:25+00:00', 'Present', 2, 2, 'Present')
(7189.0, '2024-12-08T09:27:41+00:00', 'Present', 3, 1, 'Present')
(7190.0, '2024-12-08T07:53:00+00:00', 'Present', 1, 15, None)
(7190.0, '2024-12-08T08:31:11+00:00', 'Present', 2, 14, 'Present')
(7190.0, '2024-12-08T08:47:41+00:00', 'Present', 3, 13, 'Present')
(7190.0, '2024-12-08T09:18:54+00:00', 'Present', 4, 12, 'Present')
(7190.0, '2024-12-08T09:20:30+00:00', 'Present', 5, 11, 'Present')
(7190.0, '2024-12-08T09:30:10+00:00', 'Present', 6, 10, 'Present')
(7190.0, '2024-12-08T09:30:22+00:00', 'Present', 7, 9, 'Present')
(7190.0, '2024-12-08T09:30:26+00:00', 'Present', 8, 8, 'Present')
(7190.0, '2024-12-08T09:41:04+00:00', 'Present', 9, 7, 'Present')
(7190.0, '2024-12-08T10:07:43+00:00', 'Present', 10, 6, 'Present')
(7190.0, '2024-12-08T10:17:24+00:00', 'Unoccupied', 11, 5, 'Present')
(7190.0, '2024-12-08T10:24:28+00:00', 'Present', 12, 4, 'Unoccupied')
(7190.0, '2024-12-08T10:29:18+00:00', 'Unoccupied', 13, 3, 'Present')
(7190.0, '2024-12-08T10:30:51+00:00', 'Unoccupied', 14, 2, 'Unoccupied')
(7190.0, '2024-12-08T10:31:38+00:00', 'Unoccupied', 15, 1, 'Unoccupied')
(7191.0, '2024-12-08T04:18:26+00:00', 'Present', 1, 4, None)
(7191.0, '2024-12-08T05:37:30+00:00', 'Present', 2, 3, 'Present')
(7191.0, '2024-12-08T06:46:30+00:00', 'Present', 3, 2, 'Present')
(7191.0, '2024-12-08T10:27:18+00:00', 'Unoccupied', 4, 1, 'Present')
(7193.0, '2024-12-08T06:34:37+00:00', 'Present', 1, 5, None)
(7193.0, '2024-12-08T08:02:31+00:00', 'Present', 2, 4, 'Present')
(7193.0, '2024-12-08T08:43:01+00:00', 'Present', 3, 3, 'Present')
(7193.0, '2024-12-08T09:04:23+00:00', 'Present', 4, 2, 'Present')
(7193.0, '2024-12-08T09:39:08+00:00', 'Present', 5, 1, 'Present')
(7194.0, '2024-12-08T05:11:00+00:00', 'Present', 1, 3, None)
(7194.0, '2024-12-08T06:06:34+00:00', 'Present', 2, 2, 'Present')
(7194.0, '2024-12-08T06:15:51+00:00', 'Present', 3, 1, 'Present')
(7195.0, '2024-12-08T05:31:26+00:00', 'Present', 1, 8, None)
(7195.0, '2024-12-08T06:39:50+00:00', 'Present', 2, 7, 'Present')
(7195.0, '2024-12-08T08:46:42+00:00', 'Present', 3, 6, 'Present')
(7195.0, '2024-12-08T09:12:09+00:00', 'Present', 4, 5, 'Present')
(7195.0, '2024-12-08T10:10:50+00:00', 'Present', 5, 4, 'Present')
(7195.0, '2024-12-08T10:26:34+00:00', 'Present', 6, 3, 'Present')
(7195.0, '2024-12-08T10:31:00+00:00', 'Present', 7, 2, 'Present')
(7195.0, '2024-12-08T10:31:36+00:00', 'Present', 8, 1, 'Present')
(7197.0, '2024-12-07T10:22:54+00:00', 'Unoccupied', 1, 20, None)
(7197.0, '2024-12-07T10:36:16+00:00', 'Unoccupied', 2, 19, 'Unoccupied')
(7197.0, '2024-12-07T14:19:20+00:00', 'Unoccupied', 3, 18, 'Unoccupied')
(7197.0, '2024-12-08T01:46:28+00:00', 'Unoccupied', 4, 17, 'Unoccupied')
(7197.0, '2024-12-08T04:00:01+00:00', 'Unoccupied', 5, 16, 'Unoccupied')
(7197.0, '2024-12-08T05:21:19+00:00', 'Unoccupied', 6, 15, 'Unoccupied')
(7197.0, '2024-12-08T05:56:47+00:00', 'Unoccupied', 7, 14, 'Unoccupied')
(7197.0, '2024-12-08T07:32:18+00:00', 'Present', 8, 13, 'Unoccupied')
(7197.0, '2024-12-08T07:34:23+00:00', 'Unoccupied', 9, 12, 'Present')
(7197.0, '2024-12-08T07:38:04+00:00', 'Present', 10, 11, 'Unoccupied')
(7197.0, '2024-12-08T08:08:11+00:00', 'Present', 11, 10, 'Present')
(7197.0, '2024-12-08T08:35:54+00:00', 'Unoccupied', 12, 9, 'Present')
(7197.0, '2024-12-08T08:46:39+00:00', 'Unoccupied', 13, 8, 'Unoccupied')
(7197.0, '2024-12-08T09:07:54+00:00', 'Present', 14, 7, 'Unoccupied')
(7197.0, '2024-12-08T09:29:53+00:00', 'Unoccupied', 15, 6, 'Present')
(7197.0, '2024-12-08T09:30:21+00:00', 'Present', 16, 5, 'Unoccupied')
(7197.0, '2024-12-08T09:32:50+00:00', 'Unoccupied', 17, 4, 'Present')
(7197.0, '2024-12-08T10:16:48+00:00', 'Unoccupied', 18, 3, 'Unoccupied')
(7197.0, '2024-12-08T10:27:09+00:00', 'Unoccupied', 19, 2, 'Unoccupied')
(7197.0, '2024-12-08T10:31:23+00:00', 'Present', 20, 1, 'Unoccupied')
(7200.0, '2024-12-07T08:47:27+00:00', 'Present', 1, 2, None)
(7200.0, '2024-12-08T10:06:01+00:00', 'Unoccupied', 2, 1, 'Present')
(7202.0, '2024-10-22T21:06:17+00:00', 'Present', 1, 22, None)
(7202.0, '2024-10-30T01:29:42+00:00', 'Unoccupied', 2, 21, 'Present')
(7202.0, '2024-11-08T09:39:31+00:00', 'Unoccupied', 3, 20, 'Unoccupied')
(7202.0, '2024-12-01T07:40:06+00:00', 'Unoccupied', 4, 19, 'Unoccupied')
(7202.0, '2024-12-01T20:40:14+00:00', 'Unoccupied', 5, 18, 'Unoccupied')
(7202.0, '2024-12-05T20:52:35+00:00', 'Unoccupied', 6, 17, 'Unoccupied')
(7202.0, '2024-12-07T22:31:49+00:00', 'Unoccupied', 7, 16, 'Unoccupied')
(7202.0, '2024-12-08T01:58:26+00:00', 'Unoccupied', 8, 15, 'Unoccupied')
(7202.0, '2024-12-08T06:59:52+00:00', 'Present', 9, 14, 'Unoccupied')
(7202.0, '2024-12-08T08:10:59+00:00', 'Unoccupied', 10, 13, 'Present')
(7202.0, '2024-12-08T08:32:19+00:00', 'Unoccupied', 11, 12, 'Unoccupied')
(7202.0, '2024-12-08T09:04:48+00:00', 'Unoccupied', 12, 11, 'Unoccupied')
(7202.0, '2024-12-08T09:18:10+00:00', 'Unoccupied', 13, 10, 'Unoccupied')
(7202.0, '2024-12-08T09:30:56+00:00', 'Present', 14, 9, 'Unoccupied')
(7202.0, '2024-12-08T09:31:14+00:00', 'Unoccupied', 15, 8, 'Present')
(7202.0, '2024-12-08T09:38:02+00:00', 'Unoccupied', 16, 7, 'Unoccupied')
(7202.0, '2024-12-08T09:39:47+00:00', 'Present', 17, 6, 'Unoccupied')
(7202.0, '2024-12-08T09:45:09+00:00', 'Unoccupied', 18, 5, 'Present')
(7202.0, '2024-12-08T09:45:49+00:00', 'Unoccupied', 19, 4, 'Unoccupied')
(7202.0, '2024-12-08T09:57:26+00:00', 'Unoccupied', 20, 3, 'Unoccupied')
(7202.0, '2024-12-08T10:23:06+00:00', 'Unoccupied', 21, 2, 'Unoccupied')
(7202.0, '2024-12-08T10:31:50+00:00', 'Unoccupied', 22, 1, 'Unoccupied')
(7203.0, '2024-12-08T08:06:49+00:00', 'Unoccupied', 1, 1, None)
(7205.0, '2024-04-09T05:04:34+00:00', 'Present', 1, 4, None)
(7205.0, '2024-04-09T05:37:01+00:00', 'Present', 2, 3, 'Present')
(7205.0, '2024-04-09T05:41:29+00:00', 'Unoccupied', 3, 2, 'Present')
(7205.0, '2024-12-08T07:44:15+00:00', 'Unoccupied', 4, 1, 'Unoccupied')
(7207.0, '2024-12-08T02:15:26+00:00', 'Unoccupied', 1, 5, None)
(7207.0, '2024-12-08T05:48:57+00:00', 'Unoccupied', 2, 4, 'Unoccupied')
(7207.0, '2024-12-08T07:04:50+00:00', 'Present', 3, 3, 'Unoccupied')
(7207.0, '2024-12-08T07:35:22+00:00', 'Present', 4, 2, 'Present')
(7207.0, '2024-12-08T09:41:32+00:00', 'Present', 5, 1, 'Present')
(7208.0, '2024-12-06T07:26:56+00:00', 'Unoccupied', 1, 7, None)
(7208.0, '2024-12-07T23:10:17+00:00', 'Unoccupied', 2, 6, 'Unoccupied')
(7208.0, '2024-12-07T23:26:39+00:00', 'Present', 3, 5, 'Unoccupied')
(7208.0, '2024-12-08T00:14:31+00:00', 'Unoccupied', 4, 4, 'Present')
(7208.0, '2024-12-08T06:57:22+00:00', 'Unoccupied', 5, 3, 'Unoccupied')
(7208.0, '2024-12-08T06:59:19+00:00', 'Unoccupied', 6, 2, 'Unoccupied')
(7208.0, '2024-12-08T07:12:29+00:00', 'Unoccupied', 7, 1, 'Unoccupied')
(7210.0, '2024-12-08T05:58:34+00:00', 'Present', 1, 10, None)
(7210.0, '2024-12-08T06:04:58+00:00', 'Present', 2, 9, 'Present')
(7210.0, '2024-12-08T08:29:45+00:00', 'Present', 3, 8, 'Present')
(7210.0, '2024-12-08T08:38:42+00:00', 'Present', 4, 7, 'Present')
(7210.0, '2024-12-08T09:03:39+00:00', 'Present', 5, 6, 'Present')
(7210.0, '2024-12-08T09:29:39+00:00', 'Present', 6, 5, 'Present')
(7210.0, '2024-12-08T09:36:09+00:00', 'Present', 7, 4, 'Present')
(7210.0, '2024-12-08T09:36:49+00:00', 'Present', 8, 3, 'Present')
(7210.0, '2024-12-08T09:57:16+00:00', 'Present', 9, 2, 'Present')
(7210.0, '2024-12-08T10:20:19+00:00', 'Unoccupied', 10, 1, 'Present')
(7212.0, '2024-12-07T05:03:54+00:00', 'Unoccupied', 1, 5, None)
(7212.0, '2024-12-08T05:57:54+00:00', 'Present', 2, 4, 'Unoccupied')
(7212.0, '2024-12-08T08:12:28+00:00', 'Present', 3, 3, 'Present')
(7212.0, '2024-12-08T09:12:54+00:00', 'Present', 4, 2, 'Present')
(7212.0, '2024-12-08T09:51:24+00:00', 'Unoccupied', 5, 1, 'Present')
(7213.0, '2023-10-16T00:42:09+00:00', 'Unoccupied', 1, 9, None)
(7213.0, '2023-10-16T04:29:33+00:00', 'Unoccupied', 2, 8, 'Unoccupied')
(7213.0, '2024-03-22T08:01:44+00:00', 'Present', 3, 7, 'Unoccupied')
(7213.0, '2024-03-22T10:16:27+00:00', 'Present', 4, 6, 'Present')
(7213.0, '2024-12-08T08:39:36+00:00', 'Unoccupied', 5, 5, 'Present')
(7213.0, '2024-12-08T09:05:21+00:00', 'Present', 6, 4, 'Unoccupied')
(7213.0, '2024-12-08T10:07:04+00:00', 'Unoccupied', 7, 3, 'Present')
(7213.0, '2024-12-08T10:09:04+00:00', 'Unoccupied', 8, 2, 'Unoccupied')
(7213.0, '2024-12-08T10:27:25+00:00', 'Present', 9, 1, 'Unoccupied')
(7214.0, '2024-12-07T10:35:03+00:00', 'Unoccupied', 1, 12, None)
(7214.0, '2024-12-08T01:02:00+00:00', 'Unoccupied', 2, 11, 'Unoccupied')
(7214.0, '2024-12-08T01:22:57+00:00', 'Present', 3, 10, 'Unoccupied')
(7214.0, '2024-12-08T04:14:53+00:00', 'Unoccupied', 4, 9, 'Present')
(7214.0, '2024-12-08T05:20:05+00:00', 'Unoccupied', 5, 8, 'Unoccupied')
(7214.0, '2024-12-08T06:12:23+00:00', 'Unoccupied', 6, 7, 'Unoccupied')
(7214.0, '2024-12-08T08:13:23+00:00', 'Present', 7, 6, 'Unoccupied')
(7214.0, '2024-12-08T08:55:13+00:00', 'Unoccupied', 8, 5, 'Present')
(7214.0, '2024-12-08T09:14:35+00:00', 'Present', 9, 4, 'Unoccupied')
(7214.0, '2024-12-08T09:54:41+00:00', 'Unoccupied', 10, 3, 'Present')
(7214.0, '2024-12-08T10:11:10+00:00', 'Unoccupied', 11, 2, 'Unoccupied')
(7214.0, '2024-12-08T10:18:47+00:00', 'Unoccupied', 12, 1, 'Unoccupied')
(7218.0, '2024-12-08T06:41:01+00:00', 'Present', 1, 9, None)
(7218.0, '2024-12-08T07:27:55+00:00', 'Present', 2, 8, 'Present')
(7218.0, '2024-12-08T08:07:20+00:00', 'Present', 3, 7, 'Present')
(7218.0, '2024-12-08T09:29:49+00:00', 'Present', 4, 6, 'Present')
(7218.0, '2024-12-08T10:08:27+00:00', 'Unoccupied', 5, 5, 'Present')
(7218.0, '2024-12-08T10:22:48+00:00', 'Unoccupied', 6, 4, 'Unoccupied')
(7218.0, '2024-12-08T10:23:15+00:00', 'Present', 7, 3, 'Unoccupied')
(7218.0, '2024-12-08T10:26:34+00:00', 'Unoccupied', 8, 2, 'Present')
(7218.0, '2024-12-08T10:27:17+00:00', 'Unoccupied', 9, 1, 'Unoccupied')
(7219.0, '2024-12-06T16:51:36+00:00', 'Present', 1, 13, None)
(7219.0, '2024-12-08T06:20:22+00:00', 'Present', 2, 12, 'Present')
(7219.0, '2024-12-08T07:06:42+00:00', 'Present', 3, 11, 'Present')
(7219.0, '2024-12-08T07:45:05+00:00', 'Present', 4, 10, 'Present')
(7219.0, '2024-12-08T08:03:00+00:00', 'Present', 5, 9, 'Present')
(7219.0, '2024-12-08T08:50:18+00:00', 'Present', 6, 8, 'Present')
(7219.0, '2024-12-08T09:04:07+00:00', 'Present', 7, 7, 'Present')
(7219.0, '2024-12-08T09:41:19+00:00', 'Present', 8, 6, 'Present')
(7219.0, '2024-12-08T09:44:41+00:00', 'Present', 9, 5, 'Present')
(7219.0, '2024-12-08T10:02:15+00:00', 'Present', 10, 4, 'Present')
(7219.0, '2024-12-08T10:02:39+00:00', 'Unoccupied', 11, 3, 'Present')
(7219.0, '2024-12-08T10:04:57+00:00', 'Unoccupied', 12, 2, 'Unoccupied')
(7219.0, '2024-12-08T10:08:23+00:00', 'Present', 13, 1, 'Unoccupied')
(7220.0, '2024-12-08T06:18:39+00:00', 'Present', 1, 10, None)
(7220.0, '2024-12-08T07:06:28+00:00', 'Present', 2, 9, 'Present')
(7220.0, '2024-12-08T07:23:34+00:00', 'Present', 3, 8, 'Present')
(7220.0, '2024-12-08T08:01:25+00:00', 'Present', 4, 7, 'Present')
(7220.0, '2024-12-08T08:17:51+00:00', 'Present', 5, 6, 'Present')
(7220.0, '2024-12-08T08:55:26+00:00', 'Present', 6, 5, 'Present')
(7220.0, '2024-12-08T09:19:56+00:00', 'Present', 7, 4, 'Present')
(7220.0, '2024-12-08T09:38:49+00:00', 'Present', 8, 3, 'Present')
(7220.0, '2024-12-08T09:56:02+00:00', 'Present', 9, 2, 'Present')
(7220.0, '2024-12-08T09:57:23+00:00', 'Present', 10, 1, 'Present')
(7222.0, '2024-12-08T08:05:09+00:00', 'Unoccupied', 1, 3, None)
(7222.0, '2024-12-08T08:14:37+00:00', 'Present', 2, 2, 'Unoccupied')
(7222.0, '2024-12-08T08:27:34+00:00', 'Unoccupied', 3, 1, 'Present')
(7223.0, '2024-12-08T09:02:26+00:00', 'Present', 1, 2, None)
(7223.0, '2024-12-08T10:18:01+00:00', 'Present', 2, 1, 'Present')
(7226.0, '2024-12-08T06:26:15+00:00', 'Present', 1, 12, None)
(7226.0, '2024-12-08T06:28:02+00:00', 'Present', 2, 11, 'Present')
(7226.0, '2024-12-08T07:26:03+00:00', 'Present', 3, 10, 'Present')
(7226.0, '2024-12-08T07:52:33+00:00', 'Present', 4, 9, 'Present')
(7226.0, '2024-12-08T09:08:00+00:00', 'Present', 5, 8, 'Present')
(7226.0, '2024-12-08T09:12:49+00:00', 'Present', 6, 7, 'Present')
(7226.0, '2024-12-08T09:25:11+00:00', 'Present', 7, 6, 'Present')
(7226.0, '2024-12-08T09:35:11+00:00', 'Present', 8, 5, 'Present')
(7226.0, '2024-12-08T09:50:01+00:00', 'Present', 9, 4, 'Present')
(7226.0, '2024-12-08T10:01:50+00:00', 'Unoccupied', 10, 3, 'Present')
(7226.0, '2024-12-08T10:16:25+00:00', 'Present', 11, 2, 'Unoccupied')
(7226.0, '2024-12-08T10:29:07+00:00', 'Present', 12, 1, 'Present')
(7227.0, '2024-12-07T12:05:32+00:00', 'Unoccupied', 1, 3, None)
(7227.0, '2024-12-07T15:29:21+00:00', 'Unoccupied', 2, 2, 'Unoccupied')
(7227.0, '2024-12-08T05:57:05+00:00', 'Unoccupied', 3, 1, 'Unoccupied')
(7228.0, '2024-12-07T11:44:19+00:00', 'Unoccupied', 1, 7, None)
(7228.0, '2024-12-07T12:41:03+00:00', 'Unoccupied', 2, 6, 'Unoccupied')
(7228.0, '2024-12-08T04:52:01+00:00', 'Unoccupied', 3, 5, 'Unoccupied')
(7228.0, '2024-12-08T05:19:38+00:00', 'Unoccupied', 4, 4, 'Unoccupied')
(7228.0, '2024-12-08T05:29:09+00:00', 'Unoccupied', 5, 3, 'Unoccupied')
(7228.0, '2024-12-08T06:58:03+00:00', 'Unoccupied', 6, 2, 'Unoccupied')
(7228.0, '2024-12-08T09:22:37+00:00', 'Unoccupied', 7, 1, 'Unoccupied')
(7229.0, '2024-12-07T23:00:21+00:00', 'Unoccupied', 1, 4, None)
(7229.0, '2024-12-08T04:45:39+00:00', 'Present', 2, 3, 'Unoccupied')
(7229.0, '2024-12-08T09:50:19+00:00', 'Present', 3, 2, 'Present')
(7229.0, '2024-12-08T10:15:56+00:00', 'Unoccupied', 4, 1, 'Present')
(7230.0, '2024-12-08T07:14:10+00:00', 'Unoccupied', 1, 2, None)
(7230.0, '2024-12-08T09:42:46+00:00', 'Unoccupied', 2, 1, 'Unoccupied')
(7231.0, '2023-10-16T04:10:04+00:00', 'Present', 1, 5, None)
(7231.0, '2023-10-16T04:13:48+00:00', 'Unoccupied', 2, 4, 'Present')
(7231.0, '2024-03-22T06:30:55+00:00', 'Present', 3, 3, 'Unoccupied')
(7231.0, '2024-03-22T09:48:01+00:00', 'Present', 4, 2, 'Present')
(7231.0, '2024-04-02T11:46:25+00:00', 'Present', 5, 1, 'Present')
(7232.0, '2024-12-08T04:34:05+00:00', 'Unoccupied', 1, 9, None)
(7232.0, '2024-12-08T06:04:13+00:00', 'Present', 2, 8, 'Unoccupied')
(7232.0, '2024-12-08T06:53:21+00:00', 'Present', 3, 7, 'Present')
(7232.0, '2024-12-08T06:59:15+00:00', 'Present', 4, 6, 'Present')
(7232.0, '2024-12-08T07:41:28+00:00', 'Present', 5, 5, 'Present')
(7232.0, '2024-12-08T09:10:26+00:00', 'Present', 6, 4, 'Present')
(7232.0, '2024-12-08T09:27:39+00:00', 'Present', 7, 3, 'Present')
(7232.0, '2024-12-08T09:51:18+00:00', 'Present', 8, 2, 'Present')
(7232.0, '2024-12-08T10:18:56+00:00', 'Present', 9, 1, 'Present')
(7234.0, '2024-12-08T06:16:15+00:00', 'Unoccupied', 1, 4, None)
(7234.0, '2024-12-08T07:15:59+00:00', 'Present', 2, 3, 'Unoccupied')
(7234.0, '2024-12-08T09:50:30+00:00', 'Present', 3, 2, 'Present')
(7234.0, '2024-12-08T10:24:20+00:00', 'Unoccupied', 4, 1, 'Present')
(7236.0, '2024-12-08T03:56:22+00:00', 'Present', 1, 24, None)
(7236.0, '2024-12-08T04:28:22+00:00', 'Present', 2, 23, 'Present')
(7236.0, '2024-12-08T05:43:41+00:00', 'Present', 3, 22, 'Present')
(7236.0, '2024-12-08T06:55:17+00:00', 'Present', 4, 21, 'Present')
(7236.0, '2024-12-08T07:02:02+00:00', 'Present', 5, 20, 'Present')
(7236.0, '2024-12-08T07:40:40+00:00', 'Present', 6, 19, 'Present')
(7236.0, '2024-12-08T08:19:43+00:00', 'Unoccupied', 7, 18, 'Present')
(7236.0, '2024-12-08T08:36:04+00:00', 'Unoccupied', 8, 17, 'Unoccupied')
(7236.0, '2024-12-08T08:36:32+00:00', 'Unoccupied', 9, 16, 'Unoccupied')
(7236.0, '2024-12-08T08:41:57+00:00', 'Unoccupied', 10, 15, 'Unoccupied')
(7236.0, '2024-12-08T08:43:41+00:00', 'Unoccupied', 11, 14, 'Unoccupied')
(7236.0, '2024-12-08T08:51:39+00:00', 'Unoccupied', 12, 13, 'Unoccupied')
(7236.0, '2024-12-08T08:55:32+00:00', 'Unoccupied', 13, 12, 'Unoccupied')
(7236.0, '2024-12-08T08:58:34+00:00', 'Unoccupied', 14, 11, 'Unoccupied')
(7236.0, '2024-12-08T09:07:23+00:00', 'Present', 15, 10, 'Unoccupied')
(7236.0, '2024-12-08T09:09:45+00:00', 'Unoccupied', 16, 9, 'Present')
(7236.0, '2024-12-08T09:32:08+00:00', 'Unoccupied', 17, 8, 'Unoccupied')
(7236.0, '2024-12-08T09:41:25+00:00', 'Unoccupied', 18, 7, 'Unoccupied')
(7236.0, '2024-12-08T09:47:49+00:00', 'Unoccupied', 19, 6, 'Unoccupied')
(7236.0, '2024-12-08T10:13:02+00:00', 'Present', 20, 5, 'Unoccupied')
(7236.0, '2024-12-08T10:16:04+00:00', 'Unoccupied', 21, 4, 'Present')
(7236.0, '2024-12-08T10:17:15+00:00', 'Unoccupied', 22, 3, 'Unoccupied')
(7236.0, '2024-12-08T10:20:26+00:00', 'Present', 23, 2, 'Unoccupied')
(7236.0, '2024-12-08T10:23:03+00:00', 'Unoccupied', 24, 1, 'Present')
(7237.0, '2024-12-08T06:38:13+00:00', 'Present', 1, 7, None)
(7237.0, '2024-12-08T07:19:10+00:00', 'Present', 2, 6, 'Present')
(7237.0, '2024-12-08T08:38:43+00:00', 'Unoccupied', 3, 5, 'Present')
(7237.0, '2024-12-08T08:53:06+00:00', 'Present', 4, 4, 'Unoccupied')
(7237.0, '2024-12-08T09:24:30+00:00', 'Unoccupied', 5, 3, 'Present')
(7237.0, '2024-12-08T09:25:55+00:00', 'Unoccupied', 6, 2, 'Unoccupied')
(7237.0, '2024-12-08T10:19:41+00:00', 'Present', 7, 1, 'Unoccupied')
(7239.0, '2024-12-08T03:58:24+00:00', 'Present', 1, 28, None)
(7239.0, '2024-12-08T06:32:42+00:00', 'Present', 2, 27, 'Present')
(7239.0, '2024-12-08T06:36:04+00:00', 'Unoccupied', 3, 26, 'Present')
(7239.0, '2024-12-08T07:32:10+00:00', 'Unoccupied', 4, 25, 'Unoccupied')
(7239.0, '2024-12-08T07:42:16+00:00', 'Unoccupied', 5, 24, 'Unoccupied')
(7239.0, '2024-12-08T07:44:13+00:00', 'Unoccupied', 6, 23, 'Unoccupied')
(7239.0, '2024-12-08T07:59:25+00:00', 'Present', 7, 22, 'Unoccupied')
(7239.0, '2024-12-08T08:00:47+00:00', 'Unoccupied', 8, 21, 'Present')
(7239.0, '2024-12-08T08:21:22+00:00', 'Unoccupied', 9, 20, 'Unoccupied')
(7239.0, '2024-12-08T08:22:56+00:00', 'Unoccupied', 10, 19, 'Unoccupied')
(7239.0, '2024-12-08T08:42:34+00:00', 'Unoccupied', 11, 18, 'Unoccupied')
(7239.0, '2024-12-08T08:50:26+00:00', 'Unoccupied', 12, 17, 'Unoccupied')
(7239.0, '2024-12-08T08:55:09+00:00', 'Unoccupied', 13, 16, 'Unoccupied')
(7239.0, '2024-12-08T09:18:27+00:00', 'Present', 14, 15, 'Unoccupied')
(7239.0, '2024-12-08T09:20:26+00:00', 'Unoccupied', 15, 14, 'Present')
(7239.0, '2024-12-08T09:39:17+00:00', 'Present', 16, 13, 'Unoccupied')
(7239.0, '2024-12-08T09:47:24+00:00', 'Unoccupied', 17, 12, 'Present')
(7239.0, '2024-12-08T09:49:33+00:00', 'Unoccupied', 18, 11, 'Unoccupied')
(7239.0, '2024-12-08T09:50:05+00:00', 'Unoccupied', 19, 10, 'Unoccupied')
(7239.0, '2024-12-08T09:50:13+00:00', 'Present', 20, 9, 'Unoccupied')
(7239.0, '2024-12-08T09:52:24+00:00', 'Unoccupied', 21, 8, 'Present')
(7239.0, '2024-12-08T09:56:49+00:00', 'Unoccupied', 22, 7, 'Unoccupied')
(7239.0, '2024-12-08T09:56:56+00:00', 'Unoccupied', 23, 6, 'Unoccupied')
(7239.0, '2024-12-08T09:58:44+00:00', 'Unoccupied', 24, 5, 'Unoccupied')
(7239.0, '2024-12-08T10:06:43+00:00', 'Unoccupied', 25, 4, 'Unoccupied')
(7239.0, '2024-12-08T10:11:57+00:00', 'Unoccupied', 26, 3, 'Unoccupied')
(7239.0, '2024-12-08T10:17:40+00:00', 'Unoccupied', 27, 2, 'Unoccupied')
(7239.0, '2024-12-08T10:26:13+00:00', 'Unoccupied', 28, 1, 'Unoccupied')
(7241.0, '2024-12-08T07:21:33+00:00', 'Present', 1, 5, None)
(7241.0, '2024-12-08T08:43:25+00:00', 'Unoccupied', 2, 4, 'Present')
(7241.0, '2024-12-08T10:11:18+00:00', 'Unoccupied', 3, 3, 'Unoccupied')
(7241.0, '2024-12-08T10:27:55+00:00', 'Unoccupied', 4, 2, 'Unoccupied')
(7241.0, '2024-12-08T10:31:52+00:00', 'Present', 5, 1, 'Unoccupied')
(7243.0, '2024-11-03T05:02:00+00:00', 'Present', 1, 7, None)
(7243.0, '2024-11-03T07:26:46+00:00', 'Unoccupied', 2, 6, 'Present')
(7243.0, '2024-11-03T07:33:51+00:00', 'Present', 3, 5, 'Unoccupied')
(7243.0, '2024-11-03T08:13:30+00:00', 'Unoccupied', 4, 4, 'Present')
(7243.0, '2024-11-03T08:31:15+00:00', 'Unoccupied', 5, 3, 'Unoccupied')
(7243.0, '2024-11-03T08:34:38+00:00', 'Unoccupied', 6, 2, 'Unoccupied')
(7243.0, '2024-11-03T10:53:51+00:00', 'Unoccupied', 7, 1, 'Unoccupied')
(7244.0, '2024-12-08T03:49:24+00:00', 'Unoccupied', 1, 1, None)
(7245.0, '2024-12-03T21:13:25+00:00', 'Unoccupied', 1, 17, None)
(7245.0, '2024-12-03T21:41:58+00:00', 'Unoccupied', 2, 16, 'Unoccupied')
(7245.0, '2024-12-03T22:12:04+00:00', 'Unoccupied', 3, 15, 'Unoccupied')
(7245.0, '2024-12-04T22:15:06+00:00', 'Unoccupied', 4, 14, 'Unoccupied')
(7245.0, '2024-12-07T06:33:48+00:00', 'Unoccupied', 5, 13, 'Unoccupied')
(7245.0, '2024-12-08T00:11:55+00:00', 'Unoccupied', 6, 12, 'Unoccupied')
(7245.0, '2024-12-08T01:22:11+00:00', 'Unoccupied', 7, 11, 'Unoccupied')
(7245.0, '2024-12-08T06:21:45+00:00', 'Present', 8, 10, 'Unoccupied')
(7245.0, '2024-12-08T07:23:58+00:00', 'Present', 9, 9, 'Present')
(7245.0, '2024-12-08T08:01:27+00:00', 'Present', 10, 8, 'Present')
(7245.0, '2024-12-08T08:30:45+00:00', 'Unoccupied', 11, 7, 'Present')
(7245.0, '2024-12-08T08:44:51+00:00', 'Present', 12, 6, 'Unoccupied')
(7245.0, '2024-12-08T08:50:16+00:00', 'Present', 13, 5, 'Present')
(7245.0, '2024-12-08T09:21:51+00:00', 'Present', 14, 4, 'Present')
(7245.0, '2024-12-08T09:28:29+00:00', 'Present', 15, 3, 'Present')
(7245.0, '2024-12-08T09:53:02+00:00', 'Unoccupied', 16, 2, 'Present')
(7245.0, '2024-12-08T10:30:09+00:00', 'Unoccupied', 17, 1, 'Unoccupied')
(7246.0, '2024-10-29T22:55:23+00:00', 'Present', 1, 25, None)
(7246.0, '2024-11-02T02:41:10+00:00', 'Unoccupied', 2, 24, 'Present')
(7246.0, '2024-11-02T04:21:07+00:00', 'Present', 3, 23, 'Unoccupied')
(7246.0, '2024-11-02T04:33:23+00:00', 'Present', 4, 22, 'Present')
(7246.0, '2024-11-02T12:15:13+00:00', 'Present', 5, 21, 'Present')
(7246.0, '2024-11-02T15:33:31+00:00', 'Present', 6, 20, 'Present')
(7246.0, '2024-11-02T22:22:49+00:00', 'Present', 7, 19, 'Present')
(7246.0, '2024-11-03T01:43:42+00:00', 'Unoccupied', 8, 18, 'Present')
(7246.0, '2024-11-03T01:56:21+00:00', 'Unoccupied', 9, 17, 'Unoccupied')
(7246.0, '2024-11-03T01:58:13+00:00', 'Present', 10, 16, 'Unoccupied')
(7246.0, '2024-11-03T02:57:21+00:00', 'Present', 11, 15, 'Present')
(7246.0, '2024-11-03T03:30:21+00:00', 'Unoccupied', 12, 14, 'Present')
(7246.0, '2024-11-03T05:26:56+00:00', 'Unoccupied', 13, 13, 'Unoccupied')
(7246.0, '2024-11-03T05:36:59+00:00', 'Unoccupied', 14, 12, 'Unoccupied')
(7246.0, '2024-11-03T05:46:33+00:00', 'Unoccupied', 15, 11, 'Unoccupied')
(7246.0, '2024-11-03T05:47:53+00:00', 'Unoccupied', 16, 10, 'Unoccupied')
(7246.0, '2024-11-03T07:12:12+00:00', 'Unoccupied', 17, 9, 'Unoccupied')
(7246.0, '2024-11-03T07:40:53+00:00', 'Present', 18, 8, 'Unoccupied')
(7246.0, '2024-11-03T07:49:48+00:00', 'Unoccupied', 19, 7, 'Present')
(7246.0, '2024-11-03T08:40:33+00:00', 'Unoccupied', 20, 6, 'Unoccupied')
(7246.0, '2024-11-03T09:04:42+00:00', 'Unoccupied', 21, 5, 'Unoccupied')
(7246.0, '2024-11-03T09:25:20+00:00', 'Unoccupied', 22, 4, 'Unoccupied')
(7246.0, '2024-11-03T11:10:16+00:00', 'Unoccupied', 23, 3, 'Unoccupied')
(7246.0, '2024-11-03T12:00:53+00:00', 'Unoccupied', 24, 2, 'Unoccupied')
(7246.0, '2024-11-03T12:23:43+00:00', 'Present', 25, 1, 'Unoccupied')
(7247.0, '2022-09-13T04:38:23+00:00', 'Unoccupied', 1, 32, None)
(7247.0, '2024-12-07T21:45:11+00:00', 'Unoccupied', 2, 31, 'Unoccupied')
(7247.0, '2024-12-08T03:52:33+00:00', 'Unoccupied', 3, 30, 'Unoccupied')
(7247.0, '2024-12-08T05:40:01+00:00', 'Present', 4, 29, 'Unoccupied')
(7247.0, '2024-12-08T05:53:30+00:00', 'Present', 5, 28, 'Present')
(7247.0, '2024-12-08T06:10:31+00:00', 'Present', 6, 27, 'Present')
(7247.0, '2024-12-08T06:44:15+00:00', 'Present', 7, 26, 'Present')
(7247.0, '2024-12-08T07:08:49+00:00', 'Unoccupied', 8, 25, 'Present')
(7247.0, '2024-12-08T08:32:01+00:00', 'Unoccupied', 9, 24, 'Unoccupied')
(7247.0, '2024-12-08T08:32:05+00:00', 'Unoccupied', 10, 23, 'Unoccupied')
(7247.0, '2024-12-08T08:33:21+00:00', 'Unoccupied', 11, 22, 'Unoccupied')
(7247.0, '2024-12-08T08:36:00+00:00', 'Unoccupied', 12, 21, 'Unoccupied')
(7247.0, '2024-12-08T08:37:47+00:00', 'Unoccupied', 13, 20, 'Unoccupied')
(7247.0, '2024-12-08T08:41:54+00:00', 'Unoccupied', 14, 19, 'Unoccupied')
(7247.0, '2024-12-08T08:51:22+00:00', 'Unoccupied', 15, 18, 'Unoccupied')
(7247.0, '2024-12-08T08:52:24+00:00', 'Unoccupied', 16, 17, 'Unoccupied')
(7247.0, '2024-12-08T08:56:12+00:00', 'Unoccupied', 17, 16, 'Unoccupied')
(7247.0, '2024-12-08T09:01:43+00:00', 'Unoccupied', 18, 15, 'Unoccupied')
(7247.0, '2024-12-08T09:03:03+00:00', 'Unoccupied', 19, 14, 'Unoccupied')
(7247.0, '2024-12-08T09:04:02+00:00', 'Present', 20, 13, 'Unoccupied')
(7247.0, '2024-12-08T09:07:21+00:00', 'Present', 21, 12, 'Present')
(7247.0, '2024-12-08T09:22:02+00:00', 'Unoccupied', 22, 11, 'Present')
(7247.0, '2024-12-08T09:42:18+00:00', 'Unoccupied', 23, 10, 'Unoccupied')
(7247.0, '2024-12-08T09:42:31+00:00', 'Unoccupied', 24, 9, 'Unoccupied')
(7247.0, '2024-12-08T09:57:33+00:00', 'Unoccupied', 25, 8, 'Unoccupied')
(7247.0, '2024-12-08T09:59:16+00:00', 'Unoccupied', 26, 7, 'Unoccupied')
(7247.0, '2024-12-08T10:04:29+00:00', 'Unoccupied', 27, 6, 'Unoccupied')
(7247.0, '2024-12-08T10:05:04+00:00', 'Unoccupied', 28, 5, 'Unoccupied')
(7247.0, '2024-12-08T10:22:53+00:00', 'Unoccupied', 29, 4, 'Unoccupied')
(7247.0, '2024-12-08T10:22:57+00:00', 'Unoccupied', 30, 3, 'Unoccupied')
(7247.0, '2024-12-08T10:27:32+00:00', 'Unoccupied', 31, 2, 'Unoccupied')
(7247.0, '2024-12-08T10:28:33+00:00', 'Present', 32, 1, 'Unoccupied')
(7250.0, '2024-04-10T01:29:28+00:00', 'Unoccupied', 1, 76, None)
(7250.0, '2024-09-11T09:36:41+00:00', 'Present', 2, 75, 'Unoccupied')
(7250.0, '2024-11-02T06:05:26+00:00', 'Present', 3, 74, 'Present')
(7250.0, '2024-11-02T23:40:56+00:00', 'Present', 4, 73, 'Present')
(7250.0, '2024-11-03T03:46:40+00:00', 'Present', 5, 72, 'Present')
(7250.0, '2024-11-03T06:24:02+00:00', 'Unoccupied', 6, 71, 'Present')
(7250.0, '2024-11-03T06:34:01+00:00', 'Unoccupied', 7, 70, 'Unoccupied')
(7250.0, '2024-11-03T06:43:00+00:00', 'Present', 8, 69, 'Unoccupied')
(7250.0, '2024-11-03T07:10:10+00:00', 'Unoccupied', 9, 68, 'Present')
(7250.0, '2024-11-03T07:19:04+00:00', 'Unoccupied', 10, 67, 'Unoccupied')
(7250.0, '2024-11-03T07:20:17+00:00', 'Unoccupied', 11, 66, 'Unoccupied')
(7250.0, '2024-11-03T07:21:50+00:00', 'Unoccupied', 12, 65, 'Unoccupied')
(7250.0, '2024-11-03T07:25:44+00:00', 'Unoccupied', 13, 64, 'Unoccupied')
(7250.0, '2024-11-03T07:31:32+00:00', 'Unoccupied', 14, 63, 'Unoccupied')
(7250.0, '2024-11-03T07:36:25+00:00', 'Unoccupied', 15, 62, 'Unoccupied')
(7250.0, '2024-11-03T07:37:29+00:00', 'Unoccupied', 16, 61, 'Unoccupied')
(7250.0, '2024-11-03T07:38:54+00:00', 'Unoccupied', 17, 60, 'Unoccupied')
(7250.0, '2024-11-03T07:57:18+00:00', 'Unoccupied', 18, 59, 'Unoccupied')
(7250.0, '2024-11-03T07:59:39+00:00', 'Unoccupied', 19, 58, 'Unoccupied')
(7250.0, '2024-11-03T08:06:41+00:00', 'Unoccupied', 20, 57, 'Unoccupied')
(7250.0, '2024-11-03T08:10:39+00:00', 'Unoccupied', 21, 56, 'Unoccupied')
(7250.0, '2024-11-03T08:14:39+00:00', 'Unoccupied', 22, 55, 'Unoccupied')
(7250.0, '2024-11-03T08:21:08+00:00', 'Unoccupied', 23, 54, 'Unoccupied')
(7250.0, '2024-11-03T08:22:49+00:00', 'Unoccupied', 24, 53, 'Unoccupied')
(7250.0, '2024-11-03T08:31:24+00:00', 'Unoccupied', 25, 52, 'Unoccupied')
(7250.0, '2024-11-03T08:37:53+00:00', 'Unoccupied', 26, 51, 'Unoccupied')
(7250.0, '2024-11-03T08:43:11+00:00', 'Unoccupied', 27, 50, 'Unoccupied')
(7250.0, '2024-11-03T08:56:49+00:00', 'Unoccupied', 28, 49, 'Unoccupied')
(7250.0, '2024-11-03T08:58:52+00:00', 'Unoccupied', 29, 48, 'Unoccupied')
(7250.0, '2024-11-03T09:00:47+00:00', 'Unoccupied', 30, 47, 'Unoccupied')
(7250.0, '2024-11-03T09:10:26+00:00', 'Unoccupied', 31, 46, 'Unoccupied')
(7250.0, '2024-11-03T09:18:34+00:00', 'Unoccupied', 32, 45, 'Unoccupied')
(7250.0, '2024-11-03T09:42:04+00:00', 'Present', 33, 44, 'Unoccupied')
(7250.0, '2024-11-03T10:00:11+00:00', 'Unoccupied', 34, 43, 'Present')
(7250.0, '2024-11-03T10:02:43+00:00', 'Unoccupied', 35, 42, 'Unoccupied')
(7250.0, '2024-11-03T10:03:25+00:00', 'Unoccupied', 36, 41, 'Unoccupied')
(7250.0, '2024-11-03T10:05:42+00:00', 'Unoccupied', 37, 40, 'Unoccupied')
(7250.0, '2024-11-03T10:08:31+00:00', 'Unoccupied', 38, 39, 'Unoccupied')
(7250.0, '2024-11-03T10:17:11+00:00', 'Present', 39, 38, 'Unoccupied')
(7250.0, '2024-11-03T10:28:40+00:00', 'Unoccupied', 40, 37, 'Present')
(7250.0, '2024-11-03T10:29:16+00:00', 'Unoccupied', 41, 36, 'Unoccupied')
(7250.0, '2024-11-03T10:30:05+00:00', 'Unoccupied', 42, 35, 'Unoccupied')
(7250.0, '2024-11-03T10:40:04+00:00', 'Unoccupied', 43, 34, 'Unoccupied')
(7250.0, '2024-11-03T10:49:56+00:00', 'Present', 44, 33, 'Unoccupied')
(7250.0, '2024-11-03T10:52:21+00:00', 'Unoccupied', 45, 32, 'Present')
(7250.0, '2024-11-03T10:53:46+00:00', 'Unoccupied', 46, 31, 'Unoccupied')
(7250.0, '2024-11-03T10:53:53+00:00', 'Unoccupied', 47, 30, 'Unoccupied')
(7250.0, '2024-11-03T10:55:47+00:00', 'Unoccupied', 48, 29, 'Unoccupied')
(7250.0, '2024-11-03T10:55:59+00:00', 'Unoccupied', 49, 28, 'Unoccupied')
(7250.0, '2024-11-03T10:56:07+00:00', 'Unoccupied', 50, 27, 'Unoccupied')
(7250.0, '2024-11-03T11:02:30+00:00', 'Unoccupied', 51, 26, 'Unoccupied')
(7250.0, '2024-11-03T11:04:08+00:00', 'Unoccupied', 52, 25, 'Unoccupied')
(7250.0, '2024-11-03T11:06:28+00:00', 'Unoccupied', 53, 24, 'Unoccupied')
(7250.0, '2024-11-03T11:08:55+00:00', 'Unoccupied', 54, 23, 'Unoccupied')
(7250.0, '2024-11-03T11:09:26+00:00', 'Unoccupied', 55, 22, 'Unoccupied')
(7250.0, '2024-11-03T11:13:51+00:00', 'Unoccupied', 56, 21, 'Unoccupied')
(7250.0, '2024-11-03T11:14:14+00:00', 'Unoccupied', 57, 20, 'Unoccupied')
(7250.0, '2024-11-03T11:15:42+00:00', 'Unoccupied', 58, 19, 'Unoccupied')
(7250.0, '2024-11-03T11:16:42+00:00', 'Unoccupied', 59, 18, 'Unoccupied')
(7250.0, '2024-11-03T11:16:54+00:00', 'Unoccupied', 60, 17, 'Unoccupied')
(7250.0, '2024-11-03T11:17:12+00:00', 'Unoccupied', 61, 16, 'Unoccupied')
(7250.0, '2024-11-03T11:22:48+00:00', 'Unoccupied', 62, 15, 'Unoccupied')
(7250.0, '2024-11-03T11:26:13+00:00', 'Unoccupied', 63, 14, 'Unoccupied')
(7250.0, '2024-11-03T11:31:03+00:00', 'Unoccupied', 64, 13, 'Unoccupied')
(7250.0, '2024-11-03T11:38:15+00:00', 'Unoccupied', 65, 12, 'Unoccupied')
(7250.0, '2024-11-03T11:38:24+00:00', 'Unoccupied', 66, 11, 'Unoccupied')
(7250.0, '2024-11-03T11:43:02+00:00', 'Present', 67, 10, 'Unoccupied')
(7250.0, '2024-11-03T11:51:14+00:00', 'Unoccupied', 68, 9, 'Present')
(7250.0, '2024-11-03T11:53:38+00:00', 'Unoccupied', 69, 8, 'Unoccupied')
(7250.0, '2024-11-03T12:00:09+00:00', 'Unoccupied', 70, 7, 'Unoccupied')
(7250.0, '2024-11-03T12:04:00+00:00', 'Unoccupied', 71, 6, 'Unoccupied')
(7250.0, '2024-11-03T12:07:09+00:00', 'Present', 72, 5, 'Unoccupied')
(7250.0, '2024-11-03T12:28:48+00:00', 'Present', 73, 4, 'Present')
(7250.0, '2024-11-03T12:36:09+00:00', 'Unoccupied', 74, 3, 'Present')
(7250.0, '2024-11-03T12:49:48+00:00', 'Unoccupied', 75, 2, 'Unoccupied')
(7250.0, '2024-11-03T13:01:00+00:00', 'Unoccupied', 76, 1, 'Unoccupied')
(7251.0, '2024-12-06T05:35:51+00:00', 'Present', 1, 19, None)
(7251.0, '2024-12-07T12:05:43+00:00', 'Present', 2, 18, 'Present')
(7251.0, '2024-12-08T04:59:46+00:00', 'Present', 3, 17, 'Present')
(7251.0, '2024-12-08T06:26:16+00:00', 'Present', 4, 16, 'Present')
(7251.0, '2024-12-08T06:27:23+00:00', 'Present', 5, 15, 'Present')
(7251.0, '2024-12-08T07:26:52+00:00', 'Present', 6, 14, 'Present')
(7251.0, '2024-12-08T07:30:11+00:00', 'Present', 7, 13, 'Present')
(7251.0, '2024-12-08T08:11:24+00:00', 'Present', 8, 12, 'Present')
(7251.0, '2024-12-08T08:25:37+00:00', 'Unoccupied', 9, 11, 'Present')
(7251.0, '2024-12-08T08:27:31+00:00', 'Unoccupied', 10, 10, 'Unoccupied')
(7251.0, '2024-12-08T08:27:41+00:00', 'Unoccupied', 11, 9, 'Unoccupied')
(7251.0, '2024-12-08T08:36:44+00:00', 'Unoccupied', 12, 8, 'Unoccupied')
(7251.0, '2024-12-08T08:41:50+00:00', 'Unoccupied', 13, 7, 'Unoccupied')
(7251.0, '2024-12-08T08:47:12+00:00', 'Present', 14, 6, 'Unoccupied')
(7251.0, '2024-12-08T08:55:09+00:00', 'Unoccupied', 15, 5, 'Present')
(7251.0, '2024-12-08T09:13:50+00:00', 'Present', 16, 4, 'Unoccupied')
(7251.0, '2024-12-08T09:50:19+00:00', 'Present', 17, 3, 'Present')
(7251.0, '2024-12-08T09:57:56+00:00', 'Unoccupied', 18, 2, 'Present')
(7251.0, '2024-12-08T10:27:42+00:00', 'Unoccupied', 19, 1, 'Unoccupied')
(7252.0, '2024-12-08T08:07:20+00:00', 'Unoccupied', 1, 7, None)
(7252.0, '2024-12-08T09:29:11+00:00', 'Present', 2, 6, 'Unoccupied')
(7252.0, '2024-12-08T09:39:15+00:00', 'Unoccupied', 3, 5, 'Present')
(7252.0, '2024-12-08T09:43:25+00:00', 'Unoccupied', 4, 4, 'Unoccupied')
(7252.0, '2024-12-08T10:13:50+00:00', 'Unoccupied', 5, 3, 'Unoccupied')
(7252.0, '2024-12-08T10:16:27+00:00', 'Present', 6, 2, 'Unoccupied')
(7252.0, '2024-12-08T10:26:25+00:00', 'Present', 7, 1, 'Present')
(7253.0, '2024-12-08T05:03:16+00:00', 'Present', 1, 15, None)
(7253.0, '2024-12-08T06:48:01+00:00', 'Present', 2, 14, 'Present')
(7253.0, '2024-12-08T07:04:02+00:00', 'Present', 3, 13, 'Present')
(7253.0, '2024-12-08T07:17:27+00:00', 'Present', 4, 12, 'Present')
(7253.0, '2024-12-08T08:38:40+00:00', 'Unoccupied', 5, 11, 'Present')
(7253.0, '2024-12-08T08:47:22+00:00', 'Present', 6, 10, 'Unoccupied')
(7253.0, '2024-12-08T08:57:18+00:00', 'Present', 7, 9, 'Present')
(7253.0, '2024-12-08T09:04:51+00:00', 'Present', 8, 8, 'Present')
(7253.0, '2024-12-08T09:29:32+00:00', 'Unoccupied', 9, 7, 'Present')
(7253.0, '2024-12-08T09:44:17+00:00', 'Present', 10, 6, 'Unoccupied')
(7253.0, '2024-12-08T09:49:45+00:00', 'Unoccupied', 11, 5, 'Present')
(7253.0, '2024-12-08T09:58:55+00:00', 'Present', 12, 4, 'Unoccupied')
(7253.0, '2024-12-08T10:19:47+00:00', 'Unoccupied', 13, 3, 'Present')
(7253.0, '2024-12-08T10:24:50+00:00', 'Present', 14, 2, 'Unoccupied')
(7253.0, '2024-12-08T10:28:15+00:00', 'Unoccupied', 15, 1, 'Present')
(7254.0, '2024-12-08T08:02:29+00:00', 'Present', 1, 5, None)
(7254.0, '2024-12-08T08:39:24+00:00', 'Present', 2, 4, 'Present')
(7254.0, '2024-12-08T08:49:29+00:00', 'Present', 3, 3, 'Present')
(7254.0, '2024-12-08T09:38:00+00:00', 'Unoccupied', 4, 2, 'Present')
(7254.0, '2024-12-08T10:11:35+00:00', 'Unoccupied', 5, 1, 'Unoccupied')
(7255.0, '2024-11-01T05:58:14+00:00', 'Present', 1, 25, None)
(7255.0, '2024-11-02T04:33:38+00:00', 'Unoccupied', 2, 24, 'Present')
(7255.0, '2024-11-03T03:06:19+00:00', 'Unoccupied', 3, 23, 'Unoccupied')
(7255.0, '2024-11-03T03:58:58+00:00', 'Present', 4, 22, 'Unoccupied')
(7255.0, '2024-11-03T04:06:25+00:00', 'Unoccupied', 5, 21, 'Present')
(7255.0, '2024-11-03T04:07:44+00:00', 'Unoccupied', 6, 20, 'Unoccupied')
(7255.0, '2024-11-03T04:07:54+00:00', 'Unoccupied', 7, 19, 'Unoccupied')
(7255.0, '2024-11-03T05:18:37+00:00', 'Unoccupied', 8, 18, 'Unoccupied')
(7255.0, '2024-11-03T06:05:27+00:00', 'Unoccupied', 9, 17, 'Unoccupied')
(7255.0, '2024-11-03T07:00:44+00:00', 'Unoccupied', 10, 16, 'Unoccupied')
(7255.0, '2024-11-03T07:01:45+00:00', 'Unoccupied', 11, 15, 'Unoccupied')
(7255.0, '2024-11-03T07:09:32+00:00', 'Unoccupied', 12, 14, 'Unoccupied')
(7255.0, '2024-11-03T07:11:33+00:00', 'Unoccupied', 13, 13, 'Unoccupied')
(7255.0, '2024-11-03T07:15:03+00:00', 'Unoccupied', 14, 12, 'Unoccupied')
(7255.0, '2024-11-03T07:18:34+00:00', 'Unoccupied', 15, 11, 'Unoccupied')
(7255.0, '2024-11-03T07:21:30+00:00', 'Unoccupied', 16, 10, 'Unoccupied')
(7255.0, '2024-11-03T07:22:32+00:00', 'Unoccupied', 17, 9, 'Unoccupied')
(7255.0, '2024-11-03T07:25:44+00:00', 'Unoccupied', 18, 8, 'Unoccupied')
(7255.0, '2024-11-03T07:32:32+00:00', 'Unoccupied', 19, 7, 'Unoccupied')
(7255.0, '2024-11-03T07:54:22+00:00', 'Unoccupied', 20, 6, 'Unoccupied')
(7255.0, '2024-11-03T08:21:44+00:00', 'Unoccupied', 21, 5, 'Unoccupied')
(7255.0, '2024-11-03T11:03:19+00:00', 'Unoccupied', 22, 4, 'Unoccupied')
(7255.0, '2024-11-03T11:35:45+00:00', 'Present', 23, 3, 'Unoccupied')
(7255.0, '2024-11-03T12:06:50+00:00', 'Unoccupied', 24, 2, 'Present')
(7255.0, '2024-11-03T12:34:59+00:00', 'Unoccupied', 25, 1, 'Unoccupied')
(7258.0, '2022-11-29T23:10:24+00:00', 'Unoccupied', 1, 24, None)
(7258.0, '2024-11-27T05:12:14+00:00', 'Unoccupied', 2, 23, 'Unoccupied')
(7258.0, '2024-12-08T05:21:47+00:00', 'Present', 3, 22, 'Unoccupied')
(7258.0, '2024-12-08T06:31:36+00:00', 'Present', 4, 21, 'Present')
(7258.0, '2024-12-08T07:04:42+00:00', 'Present', 5, 20, 'Present')
(7258.0, '2024-12-08T08:28:18+00:00', 'Unoccupied', 6, 19, 'Present')
(7258.0, '2024-12-08T08:32:41+00:00', 'Unoccupied', 7, 18, 'Unoccupied')
(7258.0, '2024-12-08T08:33:37+00:00', 'Unoccupied', 8, 17, 'Unoccupied')
(7258.0, '2024-12-08T08:36:51+00:00', 'Unoccupied', 9, 16, 'Unoccupied')
(7258.0, '2024-12-08T08:38:49+00:00', 'Unoccupied', 10, 15, 'Unoccupied')
(7258.0, '2024-12-08T08:39:45+00:00', 'Unoccupied', 11, 14, 'Unoccupied')
(7258.0, '2024-12-08T08:55:14+00:00', 'Present', 12, 13, 'Unoccupied')
(7258.0, '2024-12-08T08:55:16+00:00', 'Unoccupied', 13, 12, 'Present')
(7258.0, '2024-12-08T08:58:52+00:00', 'Unoccupied', 14, 11, 'Unoccupied')
(7258.0, '2024-12-08T09:31:20+00:00', 'Unoccupied', 15, 10, 'Unoccupied')
(7258.0, '2024-12-08T09:37:09+00:00', 'Present', 16, 9, 'Unoccupied')
(7258.0, '2024-12-08T09:44:29+00:00', 'Unoccupied', 17, 8, 'Present')
(7258.0, '2024-12-08T10:01:46+00:00', 'Unoccupied', 18, 7, 'Unoccupied')
(7258.0, '2024-12-08T10:04:36+00:00', 'Present', 19, 6, 'Unoccupied')
(7258.0, '2024-12-08T10:13:49+00:00', 'Present', 20, 5, 'Present')
(7258.0, '2024-12-08T10:20:50+00:00', 'Unoccupied', 21, 4, 'Present')
(7258.0, '2024-12-08T10:20:54+00:00', 'Unoccupied', 22, 3, 'Unoccupied')
(7258.0, '2024-12-08T10:26:44+00:00', 'Unoccupied', 23, 2, 'Unoccupied')
(7258.0, '2024-12-08T10:27:21+00:00', 'Unoccupied', 24, 1, 'Unoccupied')
(7259.0, '2024-12-08T07:20:49+00:00', 'Present', 1, 6, None)
(7259.0, '2024-12-08T08:24:22+00:00', 'Unoccupied', 2, 5, 'Present')
(7259.0, '2024-12-08T08:31:30+00:00', 'Unoccupied', 3, 4, 'Unoccupied')
(7259.0, '2024-12-08T08:33:15+00:00', 'Unoccupied', 4, 3, 'Unoccupied')
(7259.0, '2024-12-08T08:33:40+00:00', 'Unoccupied', 5, 2, 'Unoccupied')
(7259.0, '2024-12-08T08:55:44+00:00', 'Unoccupied', 6, 1, 'Unoccupied')
(7260.0, '2024-12-08T07:57:02+00:00', 'Present', 1, 4, None)
(7260.0, '2024-12-08T08:31:44+00:00', 'Unoccupied', 2, 3, 'Present')
(7260.0, '2024-12-08T08:46:55+00:00', 'Unoccupied', 3, 2, 'Unoccupied')
(7260.0, '2024-12-08T08:48:12+00:00', 'Unoccupied', 4, 1, 'Unoccupied')
(7261.0, '2024-12-08T08:56:05+00:00', 'Present', 1, 7, None)
(7261.0, '2024-12-08T08:59:17+00:00', 'Present', 2, 6, 'Present')
(7261.0, '2024-12-08T09:07:22+00:00', 'Present', 3, 5, 'Present')
(7261.0, '2024-12-08T09:17:48+00:00', 'Present', 4, 4, 'Present')
(7261.0, '2024-12-08T09:49:03+00:00', 'Present', 5, 3, 'Present')
(7261.0, '2024-12-08T10:12:49+00:00', 'Present', 6, 2, 'Present')
(7261.0, '2024-12-08T10:21:07+00:00', 'Present', 7, 1, 'Present')
(7264.0, '2024-12-08T07:40:56+00:00', 'Present', 1, 7, None)
(7264.0, '2024-12-08T08:43:11+00:00', 'Unoccupied', 2, 6, 'Present')
(7264.0, '2024-12-08T08:53:44+00:00', 'Unoccupied', 3, 5, 'Unoccupied')
(7264.0, '2024-12-08T08:53:50+00:00', 'Unoccupied', 4, 4, 'Unoccupied')
(7264.0, '2024-12-08T09:11:31+00:00', 'Present', 5, 3, 'Unoccupied')
(7264.0, '2024-12-08T09:51:17+00:00', 'Unoccupied', 6, 2, 'Present')
(7264.0, '2024-12-08T10:24:51+00:00', 'Unoccupied', 7, 1, 'Unoccupied')
(7265.0, '2024-06-30T21:53:37+00:00', 'Unoccupied', 1, 17, None)
(7265.0, '2024-11-26T20:44:47+00:00', 'Unoccupied', 2, 16, 'Unoccupied')
(7265.0, '2024-11-28T21:38:56+00:00', 'Unoccupied', 3, 15, 'Unoccupied')
(7265.0, '2024-11-28T21:55:57+00:00', 'Unoccupied', 4, 14, 'Unoccupied')
(7265.0, '2024-12-06T19:06:30+00:00', 'Present', 5, 13, 'Unoccupied')
(7265.0, '2024-12-08T05:31:25+00:00', 'Unoccupied', 6, 12, 'Present')
(7265.0, '2024-12-08T05:48:06+00:00', 'Present', 7, 11, 'Unoccupied')
(7265.0, '2024-12-08T06:43:09+00:00', 'Present', 8, 10, 'Present')
(7265.0, '2024-12-08T07:19:35+00:00', 'Present', 9, 9, 'Present')
(7265.0, '2024-12-08T08:01:20+00:00', 'Present', 10, 8, 'Present')
(7265.0, '2024-12-08T08:18:37+00:00', 'Present', 11, 7, 'Present')
(7265.0, '2024-12-08T08:19:38+00:00', 'Present', 12, 6, 'Present')
(7265.0, '2024-12-08T08:47:54+00:00', 'Present', 13, 5, 'Present')
(7265.0, '2024-12-08T09:39:49+00:00', 'Present', 14, 4, 'Present')
(7265.0, '2024-12-08T10:16:10+00:00', 'Unoccupied', 15, 3, 'Present')
(7265.0, '2024-12-08T10:18:27+00:00', 'Present', 16, 2, 'Unoccupied')
(7265.0, '2024-12-08T10:31:50+00:00', 'Present', 17, 1, 'Present')
(7266.0, '2024-11-13T10:26:05+00:00', 'Unoccupied', 1, 2, None)
(7266.0, '2024-12-08T10:07:35+00:00', 'Unoccupied', 2, 1, 'Unoccupied')
(7267.0, '2024-12-07T12:40:20+00:00', 'Present', 1, 5, None)
(7267.0, '2024-12-07T14:19:36+00:00', 'Unoccupied', 2, 4, 'Present')
(7267.0, '2024-12-08T06:28:06+00:00', 'Unoccupied', 3, 3, 'Unoccupied')
(7267.0, '2024-12-08T09:44:50+00:00', 'Unoccupied', 4, 2, 'Unoccupied')
(7267.0, '2024-12-08T10:09:01+00:00', 'Unoccupied', 5, 1, 'Unoccupied')
(7269.0, '2024-12-08T05:28:48+00:00', 'Present', 1, 13, None)
(7269.0, '2024-12-08T05:49:21+00:00', 'Present', 2, 12, 'Present')
(7269.0, '2024-12-08T06:41:44+00:00', 'Present', 3, 11, 'Present')
(7269.0, '2024-12-08T06:44:37+00:00', 'Present', 4, 10, 'Present')
(7269.0, '2024-12-08T08:11:24+00:00', 'Present', 5, 9, 'Present')
(7269.0, '2024-12-08T08:39:00+00:00', 'Present', 6, 8, 'Present')
(7269.0, '2024-12-08T09:08:23+00:00', 'Present', 7, 7, 'Present')
(7269.0, '2024-12-08T09:20:52+00:00', 'Unoccupied', 8, 6, 'Present')
(7269.0, '2024-12-08T09:32:01+00:00', 'Present', 9, 5, 'Unoccupied')
(7269.0, '2024-12-08T09:44:38+00:00', 'Present', 10, 4, 'Present')
(7269.0, '2024-12-08T09:45:21+00:00', 'Present', 11, 3, 'Present')
(7269.0, '2024-12-08T09:45:51+00:00', 'Present', 12, 2, 'Present')
(7269.0, '2024-12-08T10:09:33+00:00', 'Unoccupied', 13, 1, 'Present')
(7270.0, '2024-06-19T11:50:00+00:00', 'Present', 1, 14, None)
(7270.0, '2024-11-02T18:53:48+00:00', 'Present', 2, 13, 'Present')
(7270.0, '2024-11-03T00:21:07+00:00', 'Present', 3, 12, 'Present')
(7270.0, '2024-11-03T07:49:42+00:00', 'Unoccupied', 4, 11, 'Present')
(7270.0, '2024-11-03T07:56:20+00:00', 'Unoccupied', 5, 10, 'Unoccupied')
(7270.0, '2024-11-03T08:07:31+00:00', 'Present', 6, 9, 'Unoccupied')
(7270.0, '2024-11-03T08:22:58+00:00', 'Unoccupied', 7, 8, 'Present')
(7270.0, '2024-11-03T08:27:41+00:00', 'Present', 8, 7, 'Unoccupied')
(7270.0, '2024-11-03T08:57:20+00:00', 'Unoccupied', 9, 6, 'Present')
(7270.0, '2024-11-03T08:57:32+00:00', 'Present', 10, 5, 'Unoccupied')
(7270.0, '2024-11-03T09:04:43+00:00', 'Present', 11, 4, 'Present')
(7270.0, '2024-11-03T09:19:03+00:00', 'Present', 12, 3, 'Present')
(7270.0, '2024-11-03T09:48:19+00:00', 'Unoccupied', 13, 2, 'Present')
(7270.0, '2024-11-03T10:50:08+00:00', 'Present', 14, 1, 'Unoccupied')
(7271.0, '2024-10-01T03:55:53+00:00', 'Present', 1, 8, None)
(7271.0, '2024-11-03T05:05:57+00:00', 'Unoccupied', 2, 7, 'Present')
(7271.0, '2024-11-03T05:51:21+00:00', 'Unoccupied', 3, 6, 'Unoccupied')
(7271.0, '2024-11-03T06:58:54+00:00', 'Unoccupied', 4, 5, 'Unoccupied')
(7271.0, '2024-11-03T07:05:17+00:00', 'Unoccupied', 5, 4, 'Unoccupied')
(7271.0, '2024-11-03T07:05:38+00:00', 'Unoccupied', 6, 3, 'Unoccupied')
(7271.0, '2024-11-03T08:03:01+00:00', 'Unoccupied', 7, 2, 'Unoccupied')
(7271.0, '2024-11-03T08:05:23+00:00', 'Unoccupied', 8, 1, 'Unoccupied')
(7273.0, '2024-04-09T06:40:29+00:00', 'Unoccupied', 1, 14, None)
(7273.0, '2024-12-07T14:18:34+00:00', 'Unoccupied', 2, 13, 'Unoccupied')
(7273.0, '2024-12-08T00:55:42+00:00', 'Unoccupied', 3, 12, 'Unoccupied')
(7273.0, '2024-12-08T06:06:06+00:00', 'Unoccupied', 4, 11, 'Unoccupied')
(7273.0, '2024-12-08T06:45:30+00:00', 'Present', 5, 10, 'Unoccupied')
(7273.0, '2024-12-08T07:38:57+00:00', 'Unoccupied', 6, 9, 'Present')
(7273.0, '2024-12-08T07:41:29+00:00', 'Unoccupied', 7, 8, 'Unoccupied')
(7273.0, '2024-12-08T07:46:20+00:00', 'Unoccupied', 8, 7, 'Unoccupied')
(7273.0, '2024-12-08T08:22:13+00:00', 'Present', 9, 6, 'Unoccupied')
(7273.0, '2024-12-08T08:31:39+00:00', 'Unoccupied', 10, 5, 'Present')
(7273.0, '2024-12-08T09:00:15+00:00', 'Unoccupied', 11, 4, 'Unoccupied')
(7273.0, '2024-12-08T09:16:33+00:00', 'Unoccupied', 12, 3, 'Unoccupied')
(7273.0, '2024-12-08T09:36:19+00:00', 'Unoccupied', 13, 2, 'Unoccupied')
(7273.0, '2024-12-08T09:52:12+00:00', 'Unoccupied', 14, 1, 'Unoccupied')
(7274.0, '2024-12-08T10:06:46+00:00', 'Unoccupied', 1, 2, None)
(7274.0, '2024-12-08T10:26:49+00:00', 'Unoccupied', 2, 1, 'Unoccupied')
(7275.0, '2024-12-08T04:07:02+00:00', 'Unoccupied', 1, 3, None)
(7275.0, '2024-12-08T09:42:05+00:00', 'Unoccupied', 2, 2, 'Unoccupied')
(7275.0, '2024-12-08T10:07:10+00:00', 'Unoccupied', 3, 1, 'Unoccupied')
(7278.0, '2024-12-08T06:06:27+00:00', 'Present', 1, 26, None)
(7278.0, '2024-12-08T06:18:27+00:00', 'Present', 2, 25, 'Present')
(7278.0, '2024-12-08T06:37:39+00:00', 'Present', 3, 24, 'Present')
(7278.0, '2024-12-08T06:41:30+00:00', 'Unoccupied', 4, 23, 'Present')
(7278.0, '2024-12-08T06:49:35+00:00', 'Present', 5, 22, 'Unoccupied')
(7278.0, '2024-12-08T06:55:21+00:00', 'Present', 6, 21, 'Present')
(7278.0, '2024-12-08T07:14:31+00:00', 'Present', 7, 20, 'Present')
(7278.0, '2024-12-08T08:15:19+00:00', 'Present', 8, 19, 'Present')
(7278.0, '2024-12-08T08:26:20+00:00', 'Present', 9, 18, 'Present')
(7278.0, '2024-12-08T08:26:54+00:00', 'Present', 10, 17, 'Present')
(7278.0, '2024-12-08T08:27:11+00:00', 'Present', 11, 16, 'Present')
(7278.0, '2024-12-08T08:40:21+00:00', 'Present', 12, 15, 'Present')
(7278.0, '2024-12-08T08:54:19+00:00', 'Present', 13, 14, 'Present')
(7278.0, '2024-12-08T08:58:21+00:00', 'Present', 14, 13, 'Present')
(7278.0, '2024-12-08T09:07:03+00:00', 'Unoccupied', 15, 12, 'Present')
(7278.0, '2024-12-08T09:07:07+00:00', 'Present', 16, 11, 'Unoccupied')
(7278.0, '2024-12-08T09:09:32+00:00', 'Unoccupied', 17, 10, 'Present')
(7278.0, '2024-12-08T09:41:41+00:00', 'Present', 18, 9, 'Unoccupied')
(7278.0, '2024-12-08T09:46:08+00:00', 'Unoccupied', 19, 8, 'Present')
(7278.0, '2024-12-08T09:48:51+00:00', 'Unoccupied', 20, 7, 'Unoccupied')
(7278.0, '2024-12-08T09:55:32+00:00', 'Unoccupied', 21, 6, 'Unoccupied')
(7278.0, '2024-12-08T09:59:04+00:00', 'Unoccupied', 22, 5, 'Unoccupied')
(7278.0, '2024-12-08T09:59:18+00:00', 'Unoccupied', 23, 4, 'Unoccupied')
(7278.0, '2024-12-08T10:00:13+00:00', 'Unoccupied', 24, 3, 'Unoccupied')
(7278.0, '2024-12-08T10:17:48+00:00', 'Unoccupied', 25, 2, 'Unoccupied')
(7278.0, '2024-12-08T10:27:37+00:00', 'Unoccupied', 26, 1, 'Unoccupied')
(7280.0, '2024-12-08T05:02:40+00:00', 'Present', 1, 10, None)
(7280.0, '2024-12-08T05:33:16+00:00', 'Present', 2, 9, 'Present')
(7280.0, '2024-12-08T06:54:57+00:00', 'Present', 3, 8, 'Present')
(7280.0, '2024-12-08T09:12:50+00:00', 'Present', 4, 7, 'Present')
(7280.0, '2024-12-08T09:29:04+00:00', 'Present', 5, 6, 'Present')
(7280.0, '2024-12-08T09:58:31+00:00', 'Unoccupied', 6, 5, 'Present')
(7280.0, '2024-12-08T09:58:37+00:00', 'Unoccupied', 7, 4, 'Unoccupied')
(7280.0, '2024-12-08T10:15:52+00:00', 'Unoccupied', 8, 3, 'Unoccupied')
(7280.0, '2024-12-08T10:24:48+00:00', 'Unoccupied', 9, 2, 'Unoccupied')
(7280.0, '2024-12-08T10:28:18+00:00', 'Unoccupied', 10, 1, 'Unoccupied')
(7282.0, '2024-10-07T19:47:13+00:00', 'Unoccupied', 1, 1, None)
(7297.0, '2024-12-08T04:30:37+00:00', 'Present', 1, 11, None)
(7297.0, '2024-12-08T06:21:51+00:00', 'Unoccupied', 2, 10, 'Present')
(7297.0, '2024-12-08T06:47:38+00:00', 'Unoccupied', 3, 9, 'Unoccupied')
(7297.0, '2024-12-08T07:24:51+00:00', 'Unoccupied', 4, 8, 'Unoccupied')
(7297.0, '2024-12-08T08:06:37+00:00', 'Present', 5, 7, 'Unoccupied')
(7297.0, '2024-12-08T08:41:51+00:00', 'Unoccupied', 6, 6, 'Present')
(7297.0, '2024-12-08T09:02:58+00:00', 'Present', 7, 5, 'Unoccupied')
(7297.0, '2024-12-08T09:18:56+00:00', 'Unoccupied', 8, 4, 'Present')
(7297.0, '2024-12-08T09:30:34+00:00', 'Unoccupied', 9, 3, 'Unoccupied')
(7297.0, '2024-12-08T09:38:50+00:00', 'Unoccupied', 10, 2, 'Unoccupied')
(7297.0, '2024-12-08T09:42:25+00:00', 'Unoccupied', 11, 1, 'Unoccupied')
(7301.0, '2024-06-08T02:29:18+00:00', 'Unoccupied', 1, 13, None)
(7301.0, '2024-11-11T22:30:25+00:00', 'Present', 2, 12, 'Unoccupied')
(7301.0, '2024-11-21T21:48:22+00:00', 'Unoccupied', 3, 11, 'Present')
(7301.0, '2024-12-01T05:58:13+00:00', 'Unoccupied', 4, 10, 'Unoccupied')
(7301.0, '2024-12-06T04:44:59+00:00', 'Present', 5, 9, 'Unoccupied')
(7301.0, '2024-12-07T11:06:52+00:00', 'Unoccupied', 6, 8, 'Present')
(7301.0, '2024-12-08T07:25:22+00:00', 'Present', 7, 7, 'Unoccupied')
(7301.0, '2024-12-08T07:31:51+00:00', 'Present', 8, 6, 'Present')
(7301.0, '2024-12-08T08:08:27+00:00', 'Unoccupied', 9, 5, 'Present')
(7301.0, '2024-12-08T08:39:25+00:00', 'Present', 10, 4, 'Unoccupied')
(7301.0, '2024-12-08T09:08:38+00:00', 'Unoccupied', 11, 3, 'Present')
(7301.0, '2024-12-08T09:26:14+00:00', 'Unoccupied', 12, 2, 'Unoccupied')
(7301.0, '2024-12-08T10:18:44+00:00', 'Unoccupied', 13, 1, 'Unoccupied')
(7302.0, '2024-11-02T08:23:25+00:00', 'Present', 1, 25, None)
(7302.0, '2024-11-03T05:01:44+00:00', 'Unoccupied', 2, 24, 'Present')
(7302.0, '2024-11-03T05:03:14+00:00', 'Unoccupied', 3, 23, 'Unoccupied')
(7302.0, '2024-11-03T05:25:16+00:00', 'Unoccupied', 4, 22, 'Unoccupied')
(7302.0, '2024-11-03T05:30:43+00:00', 'Present', 5, 21, 'Unoccupied')
(7302.0, '2024-11-03T05:40:17+00:00', 'Unoccupied', 6, 20, 'Present')
(7302.0, '2024-11-03T05:50:20+00:00', 'Unoccupied', 7, 19, 'Unoccupied')
(7302.0, '2024-11-03T06:02:50+00:00', 'Unoccupied', 8, 18, 'Unoccupied')
(7302.0, '2024-11-03T06:03:43+00:00', 'Unoccupied', 9, 17, 'Unoccupied')
(7302.0, '2024-11-03T06:06:43+00:00', 'Unoccupied', 10, 16, 'Unoccupied')
(7302.0, '2024-11-03T06:07:05+00:00', 'Unoccupied', 11, 15, 'Unoccupied')
(7302.0, '2024-11-03T06:28:47+00:00', 'Unoccupied', 12, 14, 'Unoccupied')
(7302.0, '2024-11-03T06:41:28+00:00', 'Unoccupied', 13, 13, 'Unoccupied')
(7302.0, '2024-11-03T07:01:41+00:00', 'Unoccupied', 14, 12, 'Unoccupied')
(7302.0, '2024-11-03T07:07:22+00:00', 'Unoccupied', 15, 11, 'Unoccupied')
(7302.0, '2024-11-03T07:07:28+00:00', 'Unoccupied', 16, 10, 'Unoccupied')
(7302.0, '2024-11-03T07:10:07+00:00', 'Unoccupied', 17, 9, 'Unoccupied')
(7302.0, '2024-11-03T07:18:18+00:00', 'Unoccupied', 18, 8, 'Unoccupied')
(7302.0, '2024-11-03T07:21:08+00:00', 'Unoccupied', 19, 7, 'Unoccupied')
(7302.0, '2024-11-03T07:25:31+00:00', 'Unoccupied', 20, 6, 'Unoccupied')
(7302.0, '2024-11-03T07:27:12+00:00', 'Unoccupied', 21, 5, 'Unoccupied')
(7302.0, '2024-11-03T07:43:20+00:00', 'Unoccupied', 22, 4, 'Unoccupied')
(7302.0, '2024-11-03T08:16:33+00:00', 'Present', 23, 3, 'Unoccupied')
(7302.0, '2024-11-03T09:33:16+00:00', 'Unoccupied', 24, 2, 'Present')
(7302.0, '2024-11-03T09:57:46+00:00', 'Present', 25, 1, 'Unoccupied')
(7320.0, '2024-12-08T08:44:57+00:00', 'Present', 1, 13, None)
(7320.0, '2024-12-08T09:13:19+00:00', 'Present', 2, 12, 'Present')
(7320.0, '2024-12-08T09:30:56+00:00', 'Present', 3, 11, 'Present')
(7320.0, '2024-12-08T09:42:09+00:00', 'Present', 4, 10, 'Present')
(7320.0, '2024-12-08T09:43:45+00:00', 'Present', 5, 9, 'Present')
(7320.0, '2024-12-08T09:46:36+00:00', 'Present', 6, 8, 'Present')
(7320.0, '2024-12-08T09:52:16+00:00', 'Present', 7, 7, 'Present')
(7320.0, '2024-12-08T10:04:41+00:00', 'Present', 8, 6, 'Present')
(7320.0, '2024-12-08T10:05:50+00:00', 'Present', 9, 5, 'Present')
(7320.0, '2024-12-08T10:26:05+00:00', 'Present', 10, 4, 'Present')
(7320.0, '2024-12-08T10:28:15+00:00', 'Present', 11, 3, 'Present')
(7320.0, '2024-12-08T10:30:48+00:00', 'Unoccupied', 12, 2, 'Present')
(7320.0, '2024-12-08T10:31:50+00:00', 'Present', 13, 1, 'Unoccupied')
(7329.0, '2024-12-08T03:28:33+00:00', 'Present', 1, 5, None)
(7329.0, '2024-12-08T08:06:28+00:00', 'Present', 2, 4, 'Present')
(7329.0, '2024-12-08T08:31:57+00:00', 'Present', 3, 3, 'Present')
(7329.0, '2024-12-08T10:08:52+00:00', 'Present', 4, 2, 'Present')
(7329.0, '2024-12-08T10:23:32+00:00', 'Present', 5, 1, 'Present')
(7331.0, '2024-12-08T08:06:05+00:00', 'Present', 1, 3, None)
(7331.0, '2024-12-08T09:47:38+00:00', 'Present', 2, 2, 'Present')
(7331.0, '2024-12-08T10:27:45+00:00', 'Present', 3, 1, 'Present')
(7332.0, '2024-12-08T10:22:37+00:00', 'Present', 1, 3, None)
(7332.0, '2024-12-08T10:24:55+00:00', 'Present', 2, 2, 'Present')
(7332.0, '2024-12-08T10:31:35+00:00', 'Present', 3, 1, 'Present')
(7333.0, '2024-03-26T04:15:33+00:00', 'Present', 1, 11, None)
(7333.0, '2024-12-08T07:17:40+00:00', 'Present', 2, 10, 'Present')
(7333.0, '2024-12-08T08:30:54+00:00', 'Present', 3, 9, 'Present')
(7333.0, '2024-12-08T08:41:27+00:00', 'Present', 4, 8, 'Present')
(7333.0, '2024-12-08T08:58:12+00:00', 'Present', 5, 7, 'Present')
(7333.0, '2024-12-08T09:05:38+00:00', 'Present', 6, 6, 'Present')
(7333.0, '2024-12-08T09:05:52+00:00', 'Present', 7, 5, 'Present')
(7333.0, '2024-12-08T09:15:26+00:00', 'Present', 8, 4, 'Present')
(7333.0, '2024-12-08T09:56:26+00:00', 'Present', 9, 3, 'Present')
(7333.0, '2024-12-08T10:09:43+00:00', 'Unoccupied', 10, 2, 'Present')
(7333.0, '2024-12-08T10:28:08+00:00', 'Unoccupied', 11, 1, 'Unoccupied')
(7334.0, '2024-12-08T06:58:43+00:00', 'Present', 1, 8, None)
(7334.0, '2024-12-08T08:31:55+00:00', 'Present', 2, 7, 'Present')
(7334.0, '2024-12-08T09:17:52+00:00', 'Present', 3, 6, 'Present')
(7334.0, '2024-12-08T09:50:49+00:00', 'Present', 4, 5, 'Present')
(7334.0, '2024-12-08T09:52:08+00:00', 'Present', 5, 4, 'Present')
(7334.0, '2024-12-08T10:11:42+00:00', 'Present', 6, 3, 'Present')
(7334.0, '2024-12-08T10:29:27+00:00', 'Present', 7, 2, 'Present')
(7334.0, '2024-12-08T10:31:14+00:00', 'Present', 8, 1, 'Present')
(7335.0, '2024-12-08T06:30:29+00:00', 'Present', 1, 5, None)
(7335.0, '2024-12-08T09:47:57+00:00', 'Unoccupied', 2, 4, 'Present')
(7335.0, '2024-12-08T09:59:40+00:00', 'Present', 3, 3, 'Unoccupied')
(7335.0, '2024-12-08T10:30:26+00:00', 'Present', 4, 2, 'Present')
(7335.0, '2024-12-08T10:30:40+00:00', 'Present', 5, 1, 'Present')
(7336.0, '2024-12-08T09:17:12+00:00', 'Present', 1, 5, None)
(7336.0, '2024-12-08T09:42:31+00:00', 'Unoccupied', 2, 4, 'Present')
(7336.0, '2024-12-08T09:50:39+00:00', 'Present', 3, 3, 'Unoccupied')
(7336.0, '2024-12-08T09:51:10+00:00', 'Unoccupied', 4, 2, 'Present')
(7336.0, '2024-12-08T10:27:40+00:00', 'Present', 5, 1, 'Unoccupied')
(7339.0, '2024-12-08T09:24:56+00:00', 'Unoccupied', 1, 6, None)
(7339.0, '2024-12-08T09:32:08+00:00', 'Unoccupied', 2, 5, 'Unoccupied')
(7339.0, '2024-12-08T10:03:35+00:00', 'Unoccupied', 3, 4, 'Unoccupied')
(7339.0, '2024-12-08T10:07:07+00:00', 'Unoccupied', 4, 3, 'Unoccupied')
(7339.0, '2024-12-08T10:10:33+00:00', 'Unoccupied', 5, 2, 'Unoccupied')
(7339.0, '2024-12-08T10:27:49+00:00', 'Unoccupied', 6, 1, 'Unoccupied')
(7340.0, '2024-12-08T08:39:29+00:00', 'Present', 1, 5, None)
(7340.0, '2024-12-08T09:03:11+00:00', 'Unoccupied', 2, 4, 'Present')
(7340.0, '2024-12-08T10:03:10+00:00', 'Unoccupied', 3, 3, 'Unoccupied')
(7340.0, '2024-12-08T10:07:11+00:00', 'Present', 4, 2, 'Unoccupied')
(7340.0, '2024-12-08T10:30:43+00:00', 'Unoccupied', 5, 1, 'Present')
(7343.0, '2024-12-07T18:20:59+00:00', 'Unoccupied', 1, 10, None)
(7343.0, '2024-12-07T22:07:18+00:00', 'Present', 2, 9, 'Unoccupied')
(7343.0, '2024-12-08T06:48:25+00:00', 'Present', 3, 8, 'Present')
(7343.0, '2024-12-08T08:28:34+00:00', 'Present', 4, 7, 'Present')
(7343.0, '2024-12-08T08:37:26+00:00', 'Present', 5, 6, 'Present')
(7343.0, '2024-12-08T08:40:43+00:00', 'Present', 6, 5, 'Present')
(7343.0, '2024-12-08T09:26:57+00:00', 'Present', 7, 4, 'Present')
(7343.0, '2024-12-08T09:51:24+00:00', 'Present', 8, 3, 'Present')
(7343.0, '2024-12-08T10:27:02+00:00', 'Present', 9, 2, 'Present')
(7343.0, '2024-12-08T10:31:33+00:00', 'Unoccupied', 10, 1, 'Present')
(7344.0, '2024-12-08T05:17:34+00:00', 'Unoccupied', 1, 11, None)
(7344.0, '2024-12-08T07:12:34+00:00', 'Present', 2, 10, 'Unoccupied')
(7344.0, '2024-12-08T08:41:14+00:00', 'Present', 3, 9, 'Present')
(7344.0, '2024-12-08T09:10:12+00:00', 'Unoccupied', 4, 8, 'Present')
(7344.0, '2024-12-08T09:23:14+00:00', 'Present', 5, 7, 'Unoccupied')
(7344.0, '2024-12-08T09:58:52+00:00', 'Present', 6, 6, 'Present')
(7344.0, '2024-12-08T10:07:47+00:00', 'Present', 7, 5, 'Present')
(7344.0, '2024-12-08T10:09:04+00:00', 'Unoccupied', 8, 4, 'Present')
(7344.0, '2024-12-08T10:15:42+00:00', 'Unoccupied', 9, 3, 'Unoccupied')
(7344.0, '2024-12-08T10:22:05+00:00', 'Unoccupied', 10, 2, 'Unoccupied')
(7344.0, '2024-12-08T10:27:10+00:00', 'Unoccupied', 11, 1, 'Unoccupied')
(7345.0, '2024-12-07T17:34:29+00:00', 'Present', 1, 17, None)
(7345.0, '2024-12-08T05:01:40+00:00', 'Unoccupied', 2, 16, 'Present')
(7345.0, '2024-12-08T07:03:41+00:00', 'Present', 3, 15, 'Unoccupied')
(7345.0, '2024-12-08T07:07:37+00:00', 'Present', 4, 14, 'Present')
(7345.0, '2024-12-08T07:18:35+00:00', 'Present', 5, 13, 'Present')
(7345.0, '2024-12-08T07:32:28+00:00', 'Present', 6, 12, 'Present')
(7345.0, '2024-12-08T08:55:18+00:00', 'Present', 7, 11, 'Present')
(7345.0, '2024-12-08T09:08:17+00:00', 'Present', 8, 10, 'Present')
(7345.0, '2024-12-08T09:24:58+00:00', 'Present', 9, 9, 'Present')
(7345.0, '2024-12-08T09:33:43+00:00', 'Present', 10, 8, 'Present')
(7345.0, '2024-12-08T09:46:49+00:00', 'Present', 11, 7, 'Present')
(7345.0, '2024-12-08T10:13:51+00:00', 'Present', 12, 6, 'Present')
(7345.0, '2024-12-08T10:22:03+00:00', 'Present', 13, 5, 'Present')
(7345.0, '2024-12-08T10:27:06+00:00', 'Unoccupied', 14, 4, 'Present')
(7345.0, '2024-12-08T10:27:36+00:00', 'Present', 15, 3, 'Unoccupied')
(7345.0, '2024-12-08T10:28:06+00:00', 'Unoccupied', 16, 2, 'Present')
(7345.0, '2024-12-08T10:30:50+00:00', 'Present', 17, 1, 'Unoccupied')
(7347.0, '2024-12-08T03:00:33+00:00', 'Unoccupied', 1, 4, None)
(7347.0, '2024-12-08T06:25:51+00:00', 'Unoccupied', 2, 3, 'Unoccupied')
(7347.0, '2024-12-08T07:20:07+00:00', 'Unoccupied', 3, 2, 'Unoccupied')
(7347.0, '2024-12-08T09:42:28+00:00', 'Unoccupied', 4, 1, 'Unoccupied')
(7348.0, '2024-12-07T08:22:03+00:00', 'Present', 1, 29, None)
(7348.0, '2024-12-07T22:51:31+00:00', 'Unoccupied', 2, 28, 'Present')
(7348.0, '2024-12-07T23:25:36+00:00', 'Unoccupied', 3, 27, 'Unoccupied')
(7348.0, '2024-12-08T00:01:09+00:00', 'Unoccupied', 4, 26, 'Unoccupied')
(7348.0, '2024-12-08T00:01:50+00:00', 'Unoccupied', 5, 25, 'Unoccupied')
(7348.0, '2024-12-08T00:59:15+00:00', 'Unoccupied', 6, 24, 'Unoccupied')
(7348.0, '2024-12-08T02:12:14+00:00', 'Present', 7, 23, 'Unoccupied')
(7348.0, '2024-12-08T02:30:08+00:00', 'Unoccupied', 8, 22, 'Present')
(7348.0, '2024-12-08T02:51:32+00:00', 'Present', 9, 21, 'Unoccupied')
(7348.0, '2024-12-08T03:41:02+00:00', 'Unoccupied', 10, 20, 'Present')
(7348.0, '2024-12-08T05:13:03+00:00', 'Unoccupied', 11, 19, 'Unoccupied')
(7348.0, '2024-12-08T05:20:45+00:00', 'Unoccupied', 12, 18, 'Unoccupied')
(7348.0, '2024-12-08T05:54:03+00:00', 'Unoccupied', 13, 17, 'Unoccupied')
(7348.0, '2024-12-08T06:54:50+00:00', 'Unoccupied', 14, 16, 'Unoccupied')
(7348.0, '2024-12-08T06:55:57+00:00', 'Unoccupied', 15, 15, 'Unoccupied')
(7348.0, '2024-12-08T07:02:32+00:00', 'Unoccupied', 16, 14, 'Unoccupied')
(7348.0, '2024-12-08T07:12:42+00:00', 'Present', 17, 13, 'Unoccupied')
(7348.0, '2024-12-08T07:53:11+00:00', 'Unoccupied', 18, 12, 'Present')
(7348.0, '2024-12-08T08:27:20+00:00', 'Unoccupied', 19, 11, 'Unoccupied')
(7348.0, '2024-12-08T08:28:59+00:00', 'Unoccupied', 20, 10, 'Unoccupied')
(7348.0, '2024-12-08T09:23:03+00:00', 'Unoccupied', 21, 9, 'Unoccupied')
(7348.0, '2024-12-08T09:24:25+00:00', 'Unoccupied', 22, 8, 'Unoccupied')
(7348.0, '2024-12-08T09:36:54+00:00', 'Unoccupied', 23, 7, 'Unoccupied')
(7348.0, '2024-12-08T09:36:56+00:00', 'Unoccupied', 24, 6, 'Unoccupied')
(7348.0, '2024-12-08T09:39:42+00:00', 'Unoccupied', 25, 5, 'Unoccupied')
(7348.0, '2024-12-08T09:53:47+00:00', 'Present', 26, 4, 'Unoccupied')
(7348.0, '2024-12-08T09:56:33+00:00', 'Present', 27, 3, 'Present')
(7348.0, '2024-12-08T10:01:20+00:00', 'Present', 28, 2, 'Present')
(7348.0, '2024-12-08T10:13:27+00:00', 'Present', 29, 1, 'Present')
(7350.0, '2024-12-08T02:18:08+00:00', 'Unoccupied', 1, 6, None)
(7350.0, '2024-12-08T02:59:01+00:00', 'Unoccupied', 2, 5, 'Unoccupied')
(7350.0, '2024-12-08T08:04:54+00:00', 'Unoccupied', 3, 4, 'Unoccupied')
(7350.0, '2024-12-08T09:00:01+00:00', 'Unoccupied', 4, 3, 'Unoccupied')
(7350.0, '2024-12-08T10:19:23+00:00', 'Unoccupied', 5, 2, 'Unoccupied')
(7350.0, '2024-12-08T10:26:52+00:00', 'Unoccupied', 6, 1, 'Unoccupied')
(7354.0, '2024-03-07T02:08:19+00:00', 'Unoccupied', 1, 5, None)
(7354.0, '2024-12-08T08:59:11+00:00', 'Present', 2, 4, 'Unoccupied')
(7354.0, '2024-12-08T10:10:54+00:00', 'Unoccupied', 3, 3, 'Present')
(7354.0, '2024-12-08T10:18:07+00:00', 'Unoccupied', 4, 2, 'Unoccupied')
(7354.0, '2024-12-08T10:29:34+00:00', 'Unoccupied', 5, 1, 'Unoccupied')
(7355.0, '2024-12-08T06:25:58+00:00', 'Present', 1, 10, None)
(7355.0, '2024-12-08T08:40:40+00:00', 'Present', 2, 9, 'Present')
(7355.0, '2024-12-08T09:11:40+00:00', 'Present', 3, 8, 'Present')
(7355.0, '2024-12-08T09:17:33+00:00', 'Present', 4, 7, 'Present')
(7355.0, '2024-12-08T09:54:09+00:00', 'Present', 5, 6, 'Present')
(7355.0, '2024-12-08T09:56:36+00:00', 'Present', 6, 5, 'Present')
(7355.0, '2024-12-08T10:08:58+00:00', 'Present', 7, 4, 'Present')
(7355.0, '2024-12-08T10:10:18+00:00', 'Unoccupied', 8, 3, 'Present')
(7355.0, '2024-12-08T10:10:28+00:00', 'Present', 9, 2, 'Unoccupied')
(7355.0, '2024-12-08T10:29:06+00:00', 'Unoccupied', 10, 1, 'Present')
(7356.0, '2024-12-07T15:50:56+00:00', 'Present', 1, 9, None)
(7356.0, '2024-12-08T08:07:24+00:00', 'Present', 2, 8, 'Present')
(7356.0, '2024-12-08T09:51:16+00:00', 'Present', 3, 7, 'Present')
(7356.0, '2024-12-08T10:11:40+00:00', 'Present', 4, 6, 'Present')
(7356.0, '2024-12-08T10:14:57+00:00', 'Present', 5, 5, 'Present')
(7356.0, '2024-12-08T10:23:10+00:00', 'Unoccupied', 6, 4, 'Present')
(7356.0, '2024-12-08T10:25:04+00:00', 'Unoccupied', 7, 3, 'Unoccupied')
(7356.0, '2024-12-08T10:25:53+00:00', 'Present', 8, 2, 'Unoccupied')
(7356.0, '2024-12-08T10:29:23+00:00', 'Present', 9, 1, 'Present')
(7357.0, '2024-12-08T10:12:37+00:00', 'Unoccupied', 1, 3, None)
(7357.0, '2024-12-08T10:20:57+00:00', 'Unoccupied', 2, 2, 'Unoccupied')
(7357.0, '2024-12-08T10:28:08+00:00', 'Unoccupied', 3, 1, 'Unoccupied')
(7358.0, '2024-12-06T01:52:48+00:00', 'Unoccupied', 1, 6, None)
(7358.0, '2024-12-08T08:55:07+00:00', 'Present', 2, 5, 'Unoccupied')
(7358.0, '2024-12-08T09:42:49+00:00', 'Present', 3, 4, 'Present')
(7358.0, '2024-12-08T09:44:20+00:00', 'Present', 4, 3, 'Present')
(7358.0, '2024-12-08T10:11:22+00:00', 'Present', 5, 2, 'Present')
(7358.0, '2024-12-08T10:24:42+00:00', 'Present', 6, 1, 'Present')
(7359.0, '2024-12-08T07:32:00+00:00', 'Present', 1, 23, None)
(7359.0, '2024-12-08T07:49:31+00:00', 'Present', 2, 22, 'Present')
(7359.0, '2024-12-08T08:12:03+00:00', 'Present', 3, 21, 'Present')
(7359.0, '2024-12-08T08:16:20+00:00', 'Present', 4, 20, 'Present')
(7359.0, '2024-12-08T08:32:39+00:00', 'Present', 5, 19, 'Present')
(7359.0, '2024-12-08T08:58:39+00:00', 'Present', 6, 18, 'Present')
(7359.0, '2024-12-08T09:00:43+00:00', 'Present', 7, 17, 'Present')
(7359.0, '2024-12-08T09:03:10+00:00', 'Present', 8, 16, 'Present')
(7359.0, '2024-12-08T09:29:25+00:00', 'Present', 9, 15, 'Present')
(7359.0, '2024-12-08T09:34:48+00:00', 'Present', 10, 14, 'Present')
(7359.0, '2024-12-08T09:38:21+00:00', 'Present', 11, 13, 'Present')
(7359.0, '2024-12-08T09:47:19+00:00', 'Present', 12, 12, 'Present')
(7359.0, '2024-12-08T09:50:21+00:00', 'Present', 13, 11, 'Present')
(7359.0, '2024-12-08T09:52:27+00:00', 'Unoccupied', 14, 10, 'Present')
(7359.0, '2024-12-08T09:57:32+00:00', 'Present', 15, 9, 'Unoccupied')
(7359.0, '2024-12-08T09:59:13+00:00', 'Present', 16, 8, 'Present')
(7359.0, '2024-12-08T10:00:10+00:00', 'Present', 17, 7, 'Present')
(7359.0, '2024-12-08T10:20:02+00:00', 'Present', 18, 6, 'Present')
(7359.0, '2024-12-08T10:20:44+00:00', 'Unoccupied', 19, 5, 'Present')
(7359.0, '2024-12-08T10:26:56+00:00', 'Present', 20, 4, 'Unoccupied')
(7359.0, '2024-12-08T10:27:19+00:00', 'Unoccupied', 21, 3, 'Present')
(7359.0, '2024-12-08T10:29:16+00:00', 'Unoccupied', 22, 2, 'Unoccupied')
(7359.0, '2024-12-08T10:30:55+00:00', 'Present', 23, 1, 'Unoccupied')
(7360.0, '2024-12-08T09:03:52+00:00', 'Present', 1, 5, None)
(7360.0, '2024-12-08T09:23:55+00:00', 'Present', 2, 4, 'Present')
(7360.0, '2024-12-08T09:40:02+00:00', 'Present', 3, 3, 'Present')
(7360.0, '2024-12-08T10:28:42+00:00', 'Unoccupied', 4, 2, 'Present')
(7360.0, '2024-12-08T10:28:51+00:00', 'Present', 5, 1, 'Unoccupied')
(7362.0, '2024-08-06T23:00:59+00:00', 'Unoccupied', 1, 21, None)
(7362.0, '2024-09-19T07:13:18+00:00', 'Unoccupied', 2, 20, 'Unoccupied')
(7362.0, '2024-12-08T07:41:44+00:00', 'Present', 3, 19, 'Unoccupied')
(7362.0, '2024-12-08T07:42:07+00:00', 'Present', 4, 18, 'Present')
(7362.0, '2024-12-08T07:49:47+00:00', 'Present', 5, 17, 'Present')
(7362.0, '2024-12-08T08:15:12+00:00', 'Present', 6, 16, 'Present')
(7362.0, '2024-12-08T08:31:51+00:00', 'Unoccupied', 7, 15, 'Present')
(7362.0, '2024-12-08T09:26:43+00:00', 'Present', 8, 14, 'Unoccupied')
(7362.0, '2024-12-08T09:37:32+00:00', 'Present', 9, 13, 'Present')
(7362.0, '2024-12-08T09:52:46+00:00', 'Present', 10, 12, 'Present')
(7362.0, '2024-12-08T09:53:42+00:00', 'Present', 11, 11, 'Present')
(7362.0, '2024-12-08T10:09:19+00:00', 'Present', 12, 10, 'Present')
(7362.0, '2024-12-08T10:11:05+00:00', 'Present', 13, 9, 'Present')
(7362.0, '2024-12-08T10:20:19+00:00', 'Present', 14, 8, 'Present')
(7362.0, '2024-12-08T10:21:05+00:00', 'Present', 15, 7, 'Present')
(7362.0, '2024-12-08T10:21:09+00:00', 'Present', 16, 6, 'Present')
(7362.0, '2024-12-08T10:25:04+00:00', 'Present', 17, 5, 'Present')
(7362.0, '2024-12-08T10:28:14+00:00', 'Present', 18, 4, 'Present')
(7362.0, '2024-12-08T10:28:52+00:00', 'Unoccupied', 19, 3, 'Present')
(7362.0, '2024-12-08T10:31:17+00:00', 'Unoccupied', 20, 2, 'Unoccupied')
(7362.0, '2024-12-08T10:31:28+00:00', 'Present', 21, 1, 'Unoccupied')
(7363.0, '2024-12-08T06:49:43+00:00', 'Present', 1, 2, None)
(7363.0, '2024-12-08T10:18:28+00:00', 'Present', 2, 1, 'Present')
(7365.0, '2024-12-06T11:42:07+00:00', 'Present', 1, 7, None)
(7365.0, '2024-12-08T06:27:47+00:00', 'Present', 2, 6, 'Present')
(7365.0, '2024-12-08T06:40:11+00:00', 'Present', 3, 5, 'Present')
(7365.0, '2024-12-08T08:25:06+00:00', 'Present', 4, 4, 'Present')
(7365.0, '2024-12-08T08:50:09+00:00', 'Present', 5, 3, 'Present')
(7365.0, '2024-12-08T10:14:36+00:00', 'Present', 6, 2, 'Present')
(7365.0, '2024-12-08T10:17:43+00:00', 'Present', 7, 1, 'Present')
(7366.0, '2024-12-08T08:27:45+00:00', 'Present', 1, 11, None)
(7366.0, '2024-12-08T08:28:11+00:00', 'Present', 2, 10, 'Present')
(7366.0, '2024-12-08T08:45:36+00:00', 'Present', 3, 9, 'Present')
(7366.0, '2024-12-08T09:00:07+00:00', 'Present', 4, 8, 'Present')
(7366.0, '2024-12-08T09:30:42+00:00', 'Present', 5, 7, 'Present')
(7366.0, '2024-12-08T09:47:06+00:00', 'Present', 6, 6, 'Present')
(7366.0, '2024-12-08T09:56:25+00:00', 'Unoccupied', 7, 5, 'Present')
(7366.0, '2024-12-08T10:01:17+00:00', 'Unoccupied', 8, 4, 'Unoccupied')
(7366.0, '2024-12-08T10:09:03+00:00', 'Unoccupied', 9, 3, 'Unoccupied')
(7366.0, '2024-12-08T10:29:51+00:00', 'Present', 10, 2, 'Unoccupied')
(7366.0, '2024-12-08T10:31:27+00:00', 'Unoccupied', 11, 1, 'Present')
(7368.0, '2024-12-08T04:57:03+00:00', 'Present', 1, 2, None)
(7368.0, '2024-12-08T10:09:35+00:00', 'Present', 2, 1, 'Present')
(7377.0, '2024-12-08T09:11:23+00:00', 'Present', 1, 5, None)
(7377.0, '2024-12-08T09:14:33+00:00', 'Present', 2, 4, 'Present')
(7377.0, '2024-12-08T09:27:00+00:00', 'Present', 3, 3, 'Present')
(7377.0, '2024-12-08T09:52:30+00:00', 'Present', 4, 2, 'Present')
(7377.0, '2024-12-08T10:28:02+00:00', 'Present', 5, 1, 'Present')
(7379.0, '2024-12-08T09:27:31+00:00', 'Present', 1, 4, None)
(7379.0, '2024-12-08T09:31:53+00:00', 'Present', 2, 3, 'Present')
(7379.0, '2024-12-08T10:11:45+00:00', 'Present', 3, 2, 'Present')
(7379.0, '2024-12-08T10:13:36+00:00', 'Present', 4, 1, 'Present')
(7389.0, '2024-12-08T09:50:20+00:00', 'Present', 1, 5, None)
(7389.0, '2024-12-08T09:59:52+00:00', 'Present', 2, 4, 'Present')
(7389.0, '2024-12-08T10:00:12+00:00', 'Unoccupied', 3, 3, 'Present')
(7389.0, '2024-12-08T10:27:57+00:00', 'Unoccupied', 4, 2, 'Unoccupied')
(7389.0, '2024-12-08T10:28:27+00:00', 'Present', 5, 1, 'Unoccupied')
(7392.0, '2024-08-14T09:22:05+00:00', 'Unoccupied', 1, 14, None)
(7392.0, '2024-08-17T12:54:54+00:00', 'Unoccupied', 2, 13, 'Unoccupied')
(7392.0, '2024-08-18T03:01:19+00:00', 'Unoccupied', 3, 12, 'Unoccupied')
(7392.0, '2024-08-18T07:45:59+00:00', 'Unoccupied', 4, 11, 'Unoccupied')
(7392.0, '2024-08-18T11:06:20+00:00', 'Unoccupied', 5, 10, 'Unoccupied')
(7392.0, '2024-08-21T02:21:15+00:00', 'Unoccupied', 6, 9, 'Unoccupied')
(7392.0, '2024-08-21T04:06:16+00:00', 'Unoccupied', 7, 8, 'Unoccupied')
(7392.0, '2024-08-21T04:12:54+00:00', 'Unoccupied', 8, 7, 'Unoccupied')
(7392.0, '2024-08-21T04:13:39+00:00', 'Unoccupied', 9, 6, 'Unoccupied')
(7392.0, '2024-08-21T04:43:19+00:00', 'Unoccupied', 10, 5, 'Unoccupied')
(7392.0, '2024-08-21T20:30:09+00:00', 'Unoccupied', 11, 4, 'Unoccupied')
(7392.0, '2024-08-21T21:30:55+00:00', 'Unoccupied', 12, 3, 'Unoccupied')
(7392.0, '2024-12-05T04:45:48+00:00', 'Unoccupied', 13, 2, 'Unoccupied')
(7392.0, '2024-12-08T04:58:10+00:00', 'Unoccupied', 14, 1, 'Unoccupied')
(7394.0, '2024-08-11T11:07:54+00:00', 'Unoccupied', 1, 10, None)
(7394.0, '2024-08-17T04:23:15+00:00', 'Unoccupied', 2, 9, 'Unoccupied')
(7394.0, '2024-08-18T04:18:56+00:00', 'Unoccupied', 3, 8, 'Unoccupied')
(7394.0, '2024-08-18T08:23:46+00:00', 'Unoccupied', 4, 7, 'Unoccupied')
(7394.0, '2024-08-21T00:05:59+00:00', 'Present', 5, 6, 'Unoccupied')
(7394.0, '2024-08-21T00:34:08+00:00', 'Unoccupied', 6, 5, 'Present')
(7394.0, '2024-08-21T00:34:50+00:00', 'Present', 7, 4, 'Unoccupied')
(7394.0, '2024-08-21T00:54:44+00:00', 'Present', 8, 3, 'Present')
(7394.0, '2024-08-21T00:57:37+00:00', 'Present', 9, 2, 'Present')
(7394.0, '2024-08-21T03:58:04+00:00', 'Present', 10, 1, 'Present')
(7396.0, '2024-12-08T09:18:27+00:00', 'Present', 1, 3, None)
(7396.0, '2024-12-08T10:18:00+00:00', 'Present', 2, 2, 'Present')
(7396.0, '2024-12-08T10:23:48+00:00', 'Present', 3, 1, 'Present')
(7399.0, '2024-12-08T08:44:28+00:00', 'Present', 1, 3, None)
(7399.0, '2024-12-08T09:24:43+00:00', 'Unoccupied', 2, 2, 'Present')
(7399.0, '2024-12-08T10:18:45+00:00', 'Unoccupied', 3, 1, 'Unoccupied')
(7400.0, '2024-12-08T09:20:28+00:00', 'Present', 1, 5, None)
(7400.0, '2024-12-08T09:21:13+00:00', 'Present', 2, 4, 'Present')
(7400.0, '2024-12-08T10:03:56+00:00', 'Present', 3, 3, 'Present')
(7400.0, '2024-12-08T10:04:37+00:00', 'Present', 4, 2, 'Present')
(7400.0, '2024-12-08T10:20:38+00:00', 'Unoccupied', 5, 1, 'Present')
(7401.0, '2024-12-08T09:26:55+00:00', 'Present', 1, 3, None)
(7401.0, '2024-12-08T09:33:13+00:00', 'Present', 2, 2, 'Present')
(7401.0, '2024-12-08T09:33:15+00:00', 'Present', 3, 1, 'Present')
(7402.0, '2024-04-23T09:00:11+00:00', 'Present', 1, 6, None)
(7402.0, '2024-12-08T08:23:32+00:00', 'Present', 2, 5, 'Present')
(7402.0, '2024-12-08T09:04:17+00:00', 'Present', 3, 4, 'Present')
(7402.0, '2024-12-08T09:43:23+00:00', 'Present', 4, 3, 'Present')
(7402.0, '2024-12-08T10:15:26+00:00', 'Unoccupied', 5, 2, 'Present')
(7402.0, '2024-12-08T10:19:43+00:00', 'Unoccupied', 6, 1, 'Unoccupied')
(7406.0, '2024-12-08T08:43:02+00:00', 'Present', 1, 17, None)
(7406.0, '2024-12-08T08:57:47+00:00', 'Present', 2, 16, 'Present')
(7406.0, '2024-12-08T09:03:35+00:00', 'Present', 3, 15, 'Present')
(7406.0, '2024-12-08T09:13:34+00:00', 'Present', 4, 14, 'Present')
(7406.0, '2024-12-08T09:36:15+00:00', 'Present', 5, 13, 'Present')
(7406.0, '2024-12-08T09:44:15+00:00', 'Present', 6, 12, 'Present')
(7406.0, '2024-12-08T09:52:03+00:00', 'Unoccupied', 7, 11, 'Present')
(7406.0, '2024-12-08T09:55:44+00:00', 'Present', 8, 10, 'Unoccupied')
(7406.0, '2024-12-08T10:09:33+00:00', 'Unoccupied', 9, 9, 'Present')
(7406.0, '2024-12-08T10:11:12+00:00', 'Unoccupied', 10, 8, 'Unoccupied')
(7406.0, '2024-12-08T10:11:19+00:00', 'Unoccupied', 11, 7, 'Unoccupied')
(7406.0, '2024-12-08T10:11:42+00:00', 'Unoccupied', 12, 6, 'Unoccupied')
(7406.0, '2024-12-08T10:14:32+00:00', 'Unoccupied', 13, 5, 'Unoccupied')
(7406.0, '2024-12-08T10:26:21+00:00', 'Unoccupied', 14, 4, 'Unoccupied')
(7406.0, '2024-12-08T10:28:25+00:00', 'Present', 15, 3, 'Unoccupied')
(7406.0, '2024-12-08T10:29:55+00:00', 'Unoccupied', 16, 2, 'Present')
(7406.0, '2024-12-08T10:30:00+00:00', 'Present', 17, 1, 'Unoccupied')
(7411.0, '2024-12-08T08:21:46+00:00', 'Present', 1, 4, None)
(7411.0, '2024-12-08T08:29:02+00:00', 'Present', 2, 3, 'Present')
(7411.0, '2024-12-08T10:17:33+00:00', 'Present', 3, 2, 'Present')
(7411.0, '2024-12-08T10:24:47+00:00', 'Unoccupied', 4, 1, 'Present')
(7412.0, '2024-06-27T08:33:26+00:00', 'Unoccupied', 1, 6, None)
(7412.0, '2024-12-08T08:41:02+00:00', 'Present', 2, 5, 'Unoccupied')
(7412.0, '2024-12-08T09:33:41+00:00', 'Present', 3, 4, 'Present')
(7412.0, '2024-12-08T09:43:03+00:00', 'Unoccupied', 4, 3, 'Present')
(7412.0, '2024-12-08T10:09:29+00:00', 'Unoccupied', 5, 2, 'Unoccupied')
(7412.0, '2024-12-08T10:14:51+00:00', 'Unoccupied', 6, 1, 'Unoccupied')
(7413.0, '2024-12-08T08:54:01+00:00', 'Present', 1, 3, None)
(7413.0, '2024-12-08T09:32:22+00:00', 'Present', 2, 2, 'Present')
(7413.0, '2024-12-08T10:14:27+00:00', 'Unoccupied', 3, 1, 'Present')
(7415.0, '2024-12-08T07:39:19+00:00', 'Present', 1, 3, None)
(7415.0, '2024-12-08T08:30:09+00:00', 'Present', 2, 2, 'Present')
(7415.0, '2024-12-08T09:44:52+00:00', 'Present', 3, 1, 'Present')
(7416.0, '2024-12-08T09:45:34+00:00', 'Unoccupied', 1, 6, None)
(7416.0, '2024-12-08T09:54:53+00:00', 'Present', 2, 5, 'Unoccupied')
(7416.0, '2024-12-08T09:57:57+00:00', 'Present', 3, 4, 'Present')
(7416.0, '2024-12-08T10:00:25+00:00', 'Present', 4, 3, 'Present')
(7416.0, '2024-12-08T10:09:06+00:00', 'Present', 5, 2, 'Present')
(7416.0, '2024-12-08T10:24:29+00:00', 'Present', 6, 1, 'Present')
(7417.0, '2024-12-08T05:00:44+00:00', 'Present', 1, 10, None)
(7417.0, '2024-12-08T07:02:19+00:00', 'Unoccupied', 2, 9, 'Present')
(7417.0, '2024-12-08T07:42:05+00:00', 'Present', 3, 8, 'Unoccupied')
(7417.0, '2024-12-08T08:26:05+00:00', 'Present', 4, 7, 'Present')
(7417.0, '2024-12-08T08:40:36+00:00', 'Present', 5, 6, 'Present')
(7417.0, '2024-12-08T09:40:26+00:00', 'Present', 6, 5, 'Present')
(7417.0, '2024-12-08T09:55:09+00:00', 'Present', 7, 4, 'Present')
(7417.0, '2024-12-08T10:04:14+00:00', 'Present', 8, 3, 'Present')
(7417.0, '2024-12-08T10:20:07+00:00', 'Present', 9, 2, 'Present')
(7417.0, '2024-12-08T10:21:15+00:00', 'Unoccupied', 10, 1, 'Present')
(7418.0, '2024-12-08T08:28:37+00:00', 'Present', 1, 10, None)
(7418.0, '2024-12-08T09:22:15+00:00', 'Unoccupied', 2, 9, 'Present')
(7418.0, '2024-12-08T09:43:35+00:00', 'Present', 3, 8, 'Unoccupied')
(7418.0, '2024-12-08T10:03:14+00:00', 'Unoccupied', 4, 7, 'Present')
(7418.0, '2024-12-08T10:06:04+00:00', 'Present', 5, 6, 'Unoccupied')
(7418.0, '2024-12-08T10:22:47+00:00', 'Present', 6, 5, 'Present')
(7418.0, '2024-12-08T10:28:37+00:00', 'Unoccupied', 7, 4, 'Present')
(7418.0, '2024-12-08T10:30:09+00:00', 'Unoccupied', 8, 3, 'Unoccupied')
(7418.0, '2024-12-08T10:30:17+00:00', 'Present', 9, 2, 'Unoccupied')
(7418.0, '2024-12-08T10:31:08+00:00', 'Unoccupied', 10, 1, 'Present')
(7423.0, '2024-06-20T11:34:41+00:00', 'Unoccupied', 1, 7, None)
(7423.0, '2024-12-08T08:45:06+00:00', 'Present', 2, 6, 'Unoccupied')
(7423.0, '2024-12-08T09:33:30+00:00', 'Unoccupied', 3, 5, 'Present')
(7423.0, '2024-12-08T09:48:43+00:00', 'Present', 4, 4, 'Unoccupied')
(7423.0, '2024-12-08T09:50:49+00:00', 'Unoccupied', 5, 3, 'Present')
(7423.0, '2024-12-08T09:58:56+00:00', 'Unoccupied', 6, 2, 'Unoccupied')
(7423.0, '2024-12-08T10:02:21+00:00', 'Present', 7, 1, 'Unoccupied')
(7425.0, '2024-12-08T08:21:07+00:00', 'Present', 1, 3, None)
(7425.0, '2024-12-08T08:22:28+00:00', 'Present', 2, 2, 'Present')
(7425.0, '2024-12-08T09:48:48+00:00', 'Present', 3, 1, 'Present')
(7428.0, '2024-12-08T09:32:35+00:00', 'Unoccupied', 1, 2, None)
(7428.0, '2024-12-08T09:57:26+00:00', 'Unoccupied', 2, 1, 'Unoccupied')
(7434.0, '2024-12-06T23:59:27+00:00', 'Unoccupied', 1, 7, None)
(7434.0, '2024-12-08T08:18:23+00:00', 'Present', 2, 6, 'Unoccupied')
(7434.0, '2024-12-08T08:51:40+00:00', 'Present', 3, 5, 'Present')
(7434.0, '2024-12-08T09:03:44+00:00', 'Present', 4, 4, 'Present')
(7434.0, '2024-12-08T09:07:03+00:00', 'Present', 5, 3, 'Present')
(7434.0, '2024-12-08T09:08:54+00:00', 'Present', 6, 2, 'Present')
(7434.0, '2024-12-08T09:58:50+00:00', 'Present', 7, 1, 'Present')
(7436.0, '2024-12-03T02:42:57+00:00', 'Unoccupied', 1, 8, None)
(7436.0, '2024-12-08T07:51:54+00:00', 'Present', 2, 7, 'Unoccupied')
(7436.0, '2024-12-08T07:56:31+00:00', 'Present', 3, 6, 'Present')
(7436.0, '2024-12-08T08:41:39+00:00', 'Present', 4, 5, 'Present')
(7436.0, '2024-12-08T08:56:41+00:00', 'Present', 5, 4, 'Present')
(7436.0, '2024-12-08T09:29:38+00:00', 'Present', 6, 3, 'Present')
(7436.0, '2024-12-08T10:16:39+00:00', 'Present', 7, 2, 'Present')
(7436.0, '2024-12-08T10:22:10+00:00', 'Present', 8, 1, 'Present')
(7438.0, '2024-12-07T15:16:26+00:00', 'Present', 1, 10, None)
(7438.0, '2024-12-08T08:28:25+00:00', 'Present', 2, 9, 'Present')
(7438.0, '2024-12-08T09:04:16+00:00', 'Present', 3, 8, 'Present')
(7438.0, '2024-12-08T09:24:51+00:00', 'Unoccupied', 4, 7, 'Present')
(7438.0, '2024-12-08T09:28:45+00:00', 'Present', 5, 6, 'Unoccupied')
(7438.0, '2024-12-08T09:41:52+00:00', 'Present', 6, 5, 'Present')
(7438.0, '2024-12-08T10:02:24+00:00', 'Present', 7, 4, 'Present')
(7438.0, '2024-12-08T10:22:02+00:00', 'Present', 8, 3, 'Present')
(7438.0, '2024-12-08T10:23:59+00:00', 'Present', 9, 2, 'Present')
(7438.0, '2024-12-08T10:26:21+00:00', 'Unoccupied', 10, 1, 'Present')
(7446.0, '2024-12-08T08:29:10+00:00', 'Present', 1, 2, None)
(7446.0, '2024-12-08T10:30:04+00:00', 'Present', 2, 1, 'Present')
(7450.0, '2024-12-07T10:56:22+00:00', 'Present', 1, 7, None)
(7450.0, '2024-12-08T07:27:48+00:00', 'Present', 2, 6, 'Present')
(7450.0, '2024-12-08T08:47:19+00:00', 'Present', 3, 5, 'Present')
(7450.0, '2024-12-08T09:16:44+00:00', 'Unoccupied', 4, 4, 'Present')
(7450.0, '2024-12-08T09:49:30+00:00', 'Present', 5, 3, 'Unoccupied')
(7450.0, '2024-12-08T10:10:58+00:00', 'Present', 6, 2, 'Present')
(7450.0, '2024-12-08T10:30:34+00:00', 'Present', 7, 1, 'Present')
(7451.0, '2024-12-03T23:01:03+00:00', 'Present', 1, 7, None)
(7451.0, '2024-12-08T07:57:54+00:00', 'Present', 2, 6, 'Present')
(7451.0, '2024-12-08T09:05:47+00:00', 'Present', 3, 5, 'Present')
(7451.0, '2024-12-08T09:10:23+00:00', 'Present', 4, 4, 'Present')
(7451.0, '2024-12-08T09:20:27+00:00', 'Present', 5, 3, 'Present')
(7451.0, '2024-12-08T10:15:10+00:00', 'Present', 6, 2, 'Present')
(7451.0, '2024-12-08T10:24:57+00:00', 'Present', 7, 1, 'Present')
(7452.0, '2024-08-10T10:02:33+00:00', 'Unoccupied', 1, 5, None)
(7452.0, '2024-12-08T09:09:23+00:00', 'Present', 2, 4, 'Unoccupied')
(7452.0, '2024-12-08T10:08:59+00:00', 'Present', 3, 3, 'Present')
(7452.0, '2024-12-08T10:13:45+00:00', 'Present', 4, 2, 'Present')
(7452.0, '2024-12-08T10:25:21+00:00', 'Present', 5, 1, 'Present')
(7454.0, '2024-12-08T09:57:14+00:00', 'Unoccupied', 1, 4, None)
(7454.0, '2024-12-08T09:59:40+00:00', 'Unoccupied', 2, 3, 'Unoccupied')
(7454.0, '2024-12-08T10:16:18+00:00', 'Unoccupied', 3, 2, 'Unoccupied')
(7454.0, '2024-12-08T10:20:38+00:00', 'Present', 4, 1, 'Unoccupied')
(7455.0, '2024-12-07T02:19:31+00:00', 'Present', 1, 5, None)
(7455.0, '2024-12-08T01:11:58+00:00', 'Unoccupied', 2, 4, 'Present')
(7455.0, '2024-12-08T06:05:22+00:00', 'Present', 3, 3, 'Unoccupied')
(7455.0, '2024-12-08T09:49:45+00:00', 'Present', 4, 2, 'Present')
(7455.0, '2024-12-08T10:24:25+00:00', 'Present', 5, 1, 'Present')
(7457.0, '2024-12-08T08:29:25+00:00', 'Present', 1, 4, None)
(7457.0, '2024-12-08T09:24:14+00:00', 'Present', 2, 3, 'Present')
(7457.0, '2024-12-08T09:32:05+00:00', 'Present', 3, 2, 'Present')
(7457.0, '2024-12-08T10:20:55+00:00', 'Present', 4, 1, 'Present')
(7458.0, '2024-12-08T05:42:19+00:00', 'Present', 1, 3, None)
(7458.0, '2024-12-08T07:57:56+00:00', 'Present', 2, 2, 'Present')
(7458.0, '2024-12-08T09:43:11+00:00', 'Present', 3, 1, 'Present')
(7459.0, '2024-12-04T04:19:10+00:00', 'Unoccupied', 1, 4, None)
(7459.0, '2024-12-07T15:20:29+00:00', 'Present', 2, 3, 'Unoccupied')
(7459.0, '2024-12-08T09:01:51+00:00', 'Present', 3, 2, 'Present')
(7459.0, '2024-12-08T10:30:36+00:00', 'Present', 4, 1, 'Present')
(7474.0, '2024-12-08T04:21:47+00:00', 'Present', 1, 11, None)
(7474.0, '2024-12-08T06:18:39+00:00', 'Present', 2, 10, 'Present')
(7474.0, '2024-12-08T07:03:29+00:00', 'Present', 3, 9, 'Present')
(7474.0, '2024-12-08T07:17:52+00:00', 'Present', 4, 8, 'Present')
(7474.0, '2024-12-08T07:55:36+00:00', 'Present', 5, 7, 'Present')
(7474.0, '2024-12-08T08:26:22+00:00', 'Present', 6, 6, 'Present')
(7474.0, '2024-12-08T08:58:00+00:00', 'Present', 7, 5, 'Present')
(7474.0, '2024-12-08T09:13:36+00:00', 'Present', 8, 4, 'Present')
(7474.0, '2024-12-08T10:03:54+00:00', 'Unoccupied', 9, 3, 'Present')
(7474.0, '2024-12-08T10:28:31+00:00', 'Unoccupied', 10, 2, 'Unoccupied')
(7474.0, '2024-12-08T10:31:29+00:00', 'Present', 11, 1, 'Unoccupied')
(7476.0, '2024-12-08T10:27:47+00:00', 'Present', 1, 2, None)
(7476.0, '2024-12-08T10:28:54+00:00', 'Present', 2, 1, 'Present')
(7478.0, '2024-12-08T08:07:34+00:00', 'Present', 1, 3, None)
(7478.0, '2024-12-08T10:05:11+00:00', 'Present', 2, 2, 'Present')
(7478.0, '2024-12-08T10:28:45+00:00', 'Present', 3, 1, 'Present')
(7479.0, '2024-12-08T08:04:17+00:00', 'Present', 1, 6, None)
(7479.0, '2024-12-08T08:23:23+00:00', 'Present', 2, 5, 'Present')
(7479.0, '2024-12-08T08:34:00+00:00', 'Present', 3, 4, 'Present')
(7479.0, '2024-12-08T09:45:26+00:00', 'Present', 4, 3, 'Present')
(7479.0, '2024-12-08T09:51:26+00:00', 'Present', 5, 2, 'Present')
(7479.0, '2024-12-08T10:14:23+00:00', 'Present', 6, 1, 'Present')
(7480.0, '2024-12-08T08:17:38+00:00', 'Present', 1, 2, None)
(7480.0, '2024-12-08T10:27:17+00:00', 'Unoccupied', 2, 1, 'Present')
(7485.0, '2024-06-27T05:40:55+00:00', 'Unoccupied', 1, 14, None)
(7485.0, '2024-12-07T09:05:56+00:00', 'Present', 2, 13, 'Unoccupied')
(7485.0, '2024-12-08T07:37:52+00:00', 'Present', 3, 12, 'Present')
(7485.0, '2024-12-08T08:06:59+00:00', 'Present', 4, 11, 'Present')
(7485.0, '2024-12-08T09:30:50+00:00', 'Unoccupied', 5, 10, 'Present')
(7485.0, '2024-12-08T10:02:39+00:00', 'Present', 6, 9, 'Unoccupied')
(7485.0, '2024-12-08T10:06:50+00:00', 'Present', 7, 8, 'Present')
(7485.0, '2024-12-08T10:22:56+00:00', 'Present', 8, 7, 'Present')
(7485.0, '2024-12-08T10:24:14+00:00', 'Unoccupied', 9, 6, 'Present')
(7485.0, '2024-12-08T10:27:29+00:00', 'Unoccupied', 10, 5, 'Unoccupied')
(7485.0, '2024-12-08T10:28:05+00:00', 'Present', 11, 4, 'Unoccupied')
(7485.0, '2024-12-08T10:28:40+00:00', 'Unoccupied', 12, 3, 'Present')
(7485.0, '2024-12-08T10:31:38+00:00', 'Unoccupied', 13, 2, 'Unoccupied')
(7485.0, '2024-12-08T10:31:56+00:00', 'Unoccupied', 14, 1, 'Unoccupied')
(7486.0, '2024-12-08T08:26:29+00:00', 'Present', 1, 5, None)
(7486.0, '2024-12-08T08:36:05+00:00', 'Present', 2, 4, 'Present')
(7486.0, '2024-12-08T10:19:51+00:00', 'Unoccupied', 3, 3, 'Present')
(7486.0, '2024-12-08T10:22:28+00:00', 'Unoccupied', 4, 2, 'Unoccupied')
(7486.0, '2024-12-08T10:28:12+00:00', 'Present', 5, 1, 'Unoccupied')
(7487.0, '2024-12-08T10:11:37+00:00', 'Present', 1, 3, None)
(7487.0, '2024-12-08T10:11:51+00:00', 'Present', 2, 2, 'Present')
(7487.0, '2024-12-08T10:31:34+00:00', 'Unoccupied', 3, 1, 'Present')
(7488.0, '2024-12-08T09:35:48+00:00', 'Unoccupied', 1, 3, None)
(7488.0, '2024-12-08T09:48:02+00:00', 'Unoccupied', 2, 2, 'Unoccupied')
(7488.0, '2024-12-08T10:22:26+00:00', 'Present', 3, 1, 'Unoccupied')
(7497.0, '2024-12-08T10:04:40+00:00', 'Present', 1, 2, None)
(7497.0, '2024-12-08T10:15:20+00:00', 'Present', 2, 1, 'Present')
(7498.0, '2024-10-14T20:10:10+00:00', 'Present', 1, 11, None)
(7498.0, '2024-12-08T05:43:40+00:00', 'Unoccupied', 2, 10, 'Present')
(7498.0, '2024-12-08T08:19:31+00:00', 'Unoccupied', 3, 9, 'Unoccupied')
(7498.0, '2024-12-08T08:20:31+00:00', 'Unoccupied', 4, 8, 'Unoccupied')
(7498.0, '2024-12-08T09:20:26+00:00', 'Unoccupied', 5, 7, 'Unoccupied')
(7498.0, '2024-12-08T09:30:01+00:00', 'Unoccupied', 6, 6, 'Unoccupied')
(7498.0, '2024-12-08T09:36:03+00:00', 'Present', 7, 5, 'Unoccupied')
(7498.0, '2024-12-08T09:37:59+00:00', 'Unoccupied', 8, 4, 'Present')
(7498.0, '2024-12-08T09:42:23+00:00', 'Present', 9, 3, 'Unoccupied')
(7498.0, '2024-12-08T09:45:12+00:00', 'Present', 10, 2, 'Present')
(7498.0, '2024-12-08T10:07:04+00:00', 'Present', 11, 1, 'Present')
(7500.0, '2024-08-16T03:43:00+00:00', 'Present', 1, 3, None)
(7500.0, '2024-12-08T09:05:04+00:00', 'Present', 2, 2, 'Present')
(7500.0, '2024-12-08T09:49:45+00:00', 'Unoccupied', 3, 1, 'Present')
(7502.0, '2024-12-08T09:26:24+00:00', 'Present', 1, 4, None)
(7502.0, '2024-12-08T09:59:34+00:00', 'Unoccupied', 2, 3, 'Present')
(7502.0, '2024-12-08T10:22:41+00:00', 'Present', 3, 2, 'Unoccupied')
(7502.0, '2024-12-08T10:29:47+00:00', 'Unoccupied', 4, 1, 'Present')
(7503.0, '2024-08-16T03:27:58+00:00', 'Present', 1, 5, None)
(7503.0, '2024-08-16T03:48:02+00:00', 'Unoccupied', 2, 4, 'Present')
(7503.0, '2024-12-08T08:44:24+00:00', 'Present', 3, 3, 'Unoccupied')
(7503.0, '2024-12-08T09:36:21+00:00', 'Unoccupied', 4, 2, 'Present')
(7503.0, '2024-12-08T10:27:37+00:00', 'Unoccupied', 5, 1, 'Unoccupied')
(7505.0, '2024-12-08T09:51:23+00:00', 'Present', 1, 4, None)
(7505.0, '2024-12-08T09:58:09+00:00', 'Present', 2, 3, 'Present')
(7505.0, '2024-12-08T10:13:03+00:00', 'Present', 3, 2, 'Present')
(7505.0, '2024-12-08T10:31:34+00:00', 'Unoccupied', 4, 1, 'Present')
(7506.0, '2024-04-03T22:49:13+00:00', 'Present', 1, 9, None)
(7506.0, '2024-04-03T23:01:39+00:00', 'Present', 2, 8, 'Present')
(7506.0, '2024-04-03T23:18:00+00:00', 'Present', 3, 7, 'Present')
(7506.0, '2024-04-03T23:20:42+00:00', 'Present', 4, 6, 'Present')
(7506.0, '2024-04-04T15:45:27+00:00', 'Unoccupied', 5, 5, 'Present')
(7506.0, '2024-04-04T16:33:05+00:00', 'Unoccupied', 6, 4, 'Unoccupied')
(7506.0, '2024-12-08T08:17:07+00:00', 'Present', 7, 3, 'Unoccupied')
(7506.0, '2024-12-08T09:14:45+00:00', 'Present', 8, 2, 'Present')
(7506.0, '2024-12-08T09:27:52+00:00', 'Present', 9, 1, 'Present')
(7507.0, '2024-12-08T09:01:08+00:00', 'Present', 1, 7, None)
(7507.0, '2024-12-08T09:26:29+00:00', 'Unoccupied', 2, 6, 'Present')
(7507.0, '2024-12-08T09:41:12+00:00', 'Unoccupied', 3, 5, 'Unoccupied')
(7507.0, '2024-12-08T09:45:04+00:00', 'Present', 4, 4, 'Unoccupied')
(7507.0, '2024-12-08T09:55:55+00:00', 'Present', 5, 3, 'Present')
(7507.0, '2024-12-08T10:27:05+00:00', 'Present', 6, 2, 'Present')
(7507.0, '2024-12-08T10:30:10+00:00', 'Unoccupied', 7, 1, 'Present')
(7508.0, '2024-12-08T07:25:18+00:00', 'Present', 1, 2, None)
(7508.0, '2024-12-08T10:19:25+00:00', 'Present', 2, 1, 'Present')
(7509.0, '2024-12-08T10:28:02+00:00', 'Unoccupied', 1, 2, None)
(7509.0, '2024-12-08T10:29:27+00:00', 'Unoccupied', 2, 1, 'Unoccupied')
(7510.0, '2024-12-08T06:20:08+00:00', 'Present', 1, 6, None)
(7510.0, '2024-12-08T09:35:41+00:00', 'Present', 2, 5, 'Present')
(7510.0, '2024-12-08T09:36:57+00:00', 'Present', 3, 4, 'Present')
(7510.0, '2024-12-08T09:47:15+00:00', 'Present', 4, 3, 'Present')
(7510.0, '2024-12-08T10:05:37+00:00', 'Present', 5, 2, 'Present')
(7510.0, '2024-12-08T10:11:15+00:00', 'Present', 6, 1, 'Present')
(7512.0, '2024-12-08T08:51:01+00:00', 'Present', 1, 5, None)
(7512.0, '2024-12-08T09:08:47+00:00', 'Present', 2, 4, 'Present')
(7512.0, '2024-12-08T09:52:06+00:00', 'Unoccupied', 3, 3, 'Present')
(7512.0, '2024-12-08T09:53:44+00:00', 'Unoccupied', 4, 2, 'Unoccupied')
(7512.0, '2024-12-08T10:24:59+00:00', 'Present', 5, 1, 'Unoccupied')
(7514.0, '2024-12-08T06:26:17+00:00', 'Present', 1, 11, None)
(7514.0, '2024-12-08T07:28:13+00:00', 'Present', 2, 10, 'Present')
(7514.0, '2024-12-08T09:37:28+00:00', 'Present', 3, 9, 'Present')
(7514.0, '2024-12-08T10:02:35+00:00', 'Present', 4, 8, 'Present')
(7514.0, '2024-12-08T10:10:13+00:00', 'Present', 5, 7, 'Present')
(7514.0, '2024-12-08T10:13:32+00:00', 'Present', 6, 6, 'Present')
(7514.0, '2024-12-08T10:19:30+00:00', 'Present', 7, 5, 'Present')
(7514.0, '2024-12-08T10:20:18+00:00', 'Present', 8, 4, 'Present')
(7514.0, '2024-12-08T10:24:31+00:00', 'Present', 9, 3, 'Present')
(7514.0, '2024-12-08T10:29:47+00:00', 'Unoccupied', 10, 2, 'Present')
(7514.0, '2024-12-08T10:31:49+00:00', 'Unoccupied', 11, 1, 'Unoccupied')
(7519.0, '2024-12-08T10:26:36+00:00', 'Unoccupied', 1, 1, None)
(7520.0, '2023-09-12T21:37:24+00:00', 'Unoccupied', 1, 7, None)
(7520.0, '2024-01-18T02:58:11+00:00', 'Unoccupied', 2, 6, 'Unoccupied')
(7520.0, '2024-07-05T11:02:23+00:00', 'Unoccupied', 3, 5, 'Unoccupied')
(7520.0, '2024-08-20T07:55:24+00:00', 'Unoccupied', 4, 4, 'Unoccupied')
(7520.0, '2024-08-21T00:37:20+00:00', 'Unoccupied', 5, 3, 'Unoccupied')
(7520.0, '2024-08-21T00:38:04+00:00', 'Unoccupied', 6, 2, 'Unoccupied')
(7520.0, '2024-08-21T04:04:29+00:00', 'Unoccupied', 7, 1, 'Unoccupied')
(7522.0, '2024-12-08T07:12:31+00:00', 'Present', 1, 3, None)
(7522.0, '2024-12-08T09:31:17+00:00', 'Present', 2, 2, 'Present')
(7522.0, '2024-12-08T10:09:24+00:00', 'Unoccupied', 3, 1, 'Present')
(7527.0, '2024-12-08T05:15:25+00:00', 'Present', 1, 7, None)
(7527.0, '2024-12-08T06:15:48+00:00', 'Present', 2, 6, 'Present')
(7527.0, '2024-12-08T06:40:25+00:00', 'Unoccupied', 3, 5, 'Present')
(7527.0, '2024-12-08T07:39:17+00:00', 'Unoccupied', 4, 4, 'Unoccupied')
(7527.0, '2024-12-08T09:45:05+00:00', 'Unoccupied', 5, 3, 'Unoccupied')
(7527.0, '2024-12-08T10:05:41+00:00', 'Unoccupied', 6, 2, 'Unoccupied')
(7527.0, '2024-12-08T10:12:34+00:00', 'Unoccupied', 7, 1, 'Unoccupied')
(7528.0, '2024-10-01T09:22:13+00:00', 'Unoccupied', 1, 9, None)
(7528.0, '2024-12-07T14:29:48+00:00', 'Unoccupied', 2, 8, 'Unoccupied')
(7528.0, '2024-12-08T06:13:21+00:00', 'Unoccupied', 3, 7, 'Unoccupied')
(7528.0, '2024-12-08T08:31:03+00:00', 'Unoccupied', 4, 6, 'Unoccupied')
(7528.0, '2024-12-08T09:04:37+00:00', 'Unoccupied', 5, 5, 'Unoccupied')
(7528.0, '2024-12-08T09:28:35+00:00', 'Unoccupied', 6, 4, 'Unoccupied')
(7528.0, '2024-12-08T09:35:55+00:00', 'Unoccupied', 7, 3, 'Unoccupied')
(7528.0, '2024-12-08T10:06:54+00:00', 'Present', 8, 2, 'Unoccupied')
(7528.0, '2024-12-08T10:30:20+00:00', 'Present', 9, 1, 'Present')
(7529.0, '2024-12-08T08:43:05+00:00', 'Present', 1, 7, None)
(7529.0, '2024-12-08T08:54:11+00:00', 'Present', 2, 6, 'Present')
(7529.0, '2024-12-08T10:00:53+00:00', 'Present', 3, 5, 'Present')
(7529.0, '2024-12-08T10:08:56+00:00', 'Present', 4, 4, 'Present')
(7529.0, '2024-12-08T10:18:11+00:00', 'Unoccupied', 5, 3, 'Present')
(7529.0, '2024-12-08T10:31:26+00:00', 'Unoccupied', 6, 2, 'Unoccupied')
(7529.0, '2024-12-08T10:31:36+00:00', 'Present', 7, 1, 'Unoccupied')
(7532.0, '2024-12-08T02:43:12+00:00', 'Unoccupied', 1, 9, None)
(7532.0, '2024-12-08T02:51:00+00:00', 'Unoccupied', 2, 8, 'Unoccupied')
(7532.0, '2024-12-08T05:13:02+00:00', 'Unoccupied', 3, 7, 'Unoccupied')
(7532.0, '2024-12-08T06:26:52+00:00', 'Unoccupied', 4, 6, 'Unoccupied')
(7532.0, '2024-12-08T08:01:26+00:00', 'Present', 5, 5, 'Unoccupied')
(7532.0, '2024-12-08T09:28:40+00:00', 'Unoccupied', 6, 4, 'Present')
(7532.0, '2024-12-08T09:29:27+00:00', 'Present', 7, 3, 'Unoccupied')
(7532.0, '2024-12-08T09:55:47+00:00', 'Unoccupied', 8, 2, 'Present')
(7532.0, '2024-12-08T09:57:33+00:00', 'Present', 9, 1, 'Unoccupied')
(7533.0, '2024-12-08T07:31:47+00:00', 'Present', 1, 5, None)
(7533.0, '2024-12-08T08:27:46+00:00', 'Present', 2, 4, 'Present')
(7533.0, '2024-12-08T08:34:43+00:00', 'Present', 3, 3, 'Present')
(7533.0, '2024-12-08T09:01:47+00:00', 'Present', 4, 2, 'Present')
(7533.0, '2024-12-08T10:29:10+00:00', 'Present', 5, 1, 'Present')
(7534.0, '2024-12-08T04:36:25+00:00', 'Unoccupied', 1, 12, None)
(7534.0, '2024-12-08T06:37:59+00:00', 'Unoccupied', 2, 11, 'Unoccupied')
(7534.0, '2024-12-08T09:27:42+00:00', 'Unoccupied', 3, 10, 'Unoccupied')
(7534.0, '2024-12-08T09:35:08+00:00', 'Unoccupied', 4, 9, 'Unoccupied')
(7534.0, '2024-12-08T09:35:25+00:00', 'Present', 5, 8, 'Unoccupied')
(7534.0, '2024-12-08T09:43:56+00:00', 'Present', 6, 7, 'Present')
(7534.0, '2024-12-08T09:45:33+00:00', 'Present', 7, 6, 'Present')
(7534.0, '2024-12-08T09:55:44+00:00', 'Unoccupied', 8, 5, 'Present')
(7534.0, '2024-12-08T10:08:07+00:00', 'Present', 9, 4, 'Unoccupied')
(7534.0, '2024-12-08T10:23:45+00:00', 'Unoccupied', 10, 3, 'Present')
(7534.0, '2024-12-08T10:26:55+00:00', 'Unoccupied', 11, 2, 'Unoccupied')
(7534.0, '2024-12-08T10:27:52+00:00', 'Unoccupied', 12, 1, 'Unoccupied')
(7536.0, '2024-12-08T10:16:49+00:00', 'Unoccupied', 1, 2, None)
(7536.0, '2024-12-08T10:21:14+00:00', 'Unoccupied', 2, 1, 'Unoccupied')
(7537.0, '2024-04-03T19:54:28+00:00', 'Present', 1, 21, None)
(7537.0, '2024-04-03T20:09:39+00:00', 'Present', 2, 20, 'Present')
(7537.0, '2024-04-03T21:54:28+00:00', 'Present', 3, 19, 'Present')
(7537.0, '2024-04-03T22:16:19+00:00', 'Present', 4, 18, 'Present')
(7537.0, '2024-04-03T22:25:17+00:00', 'Present', 5, 17, 'Present')
(7537.0, '2024-04-03T22:40:24+00:00', 'Present', 6, 16, 'Present')
(7537.0, '2024-04-03T22:47:33+00:00', 'Present', 7, 15, 'Present')
(7537.0, '2024-04-03T22:48:47+00:00', 'Present', 8, 14, 'Present')
(7537.0, '2024-04-03T23:10:45+00:00', 'Present', 9, 13, 'Present')
(7537.0, '2024-04-03T23:11:29+00:00', 'Present', 10, 12, 'Present')
(7537.0, '2024-04-03T23:25:21+00:00', 'Unoccupied', 11, 11, 'Present')
(7537.0, '2024-04-04T14:34:05+00:00', 'Unoccupied', 12, 10, 'Unoccupied')
(7537.0, '2024-04-04T14:51:32+00:00', 'Unoccupied', 13, 9, 'Unoccupied')
(7537.0, '2024-04-04T15:02:42+00:00', 'Unoccupied', 14, 8, 'Unoccupied')
(7537.0, '2024-04-04T15:52:18+00:00', 'Unoccupied', 15, 7, 'Unoccupied')
(7537.0, '2024-11-28T03:20:36+00:00', 'Unoccupied', 16, 6, 'Unoccupied')
(7537.0, '2024-12-07T11:32:44+00:00', 'Present', 17, 5, 'Unoccupied')
(7537.0, '2024-12-08T08:25:59+00:00', 'Unoccupied', 18, 4, 'Present')
(7537.0, '2024-12-08T09:17:38+00:00', 'Present', 19, 3, 'Unoccupied')
(7537.0, '2024-12-08T09:39:00+00:00', 'Present', 20, 2, 'Present')
(7537.0, '2024-12-08T10:23:02+00:00', 'Unoccupied', 21, 1, 'Present')
(7538.0, '2024-11-23T13:40:10+00:00', 'Unoccupied', 1, 11, None)
(7538.0, '2024-12-04T04:41:24+00:00', 'Unoccupied', 2, 10, 'Unoccupied')
(7538.0, '2024-12-06T22:52:19+00:00', 'Unoccupied', 3, 9, 'Unoccupied')
(7538.0, '2024-12-08T08:46:01+00:00', 'Present', 4, 8, 'Unoccupied')
(7538.0, '2024-12-08T09:10:32+00:00', 'Present', 5, 7, 'Present')
(7538.0, '2024-12-08T10:00:31+00:00', 'Present', 6, 6, 'Present')
(7538.0, '2024-12-08T10:14:57+00:00', 'Present', 7, 5, 'Present')
(7538.0, '2024-12-08T10:19:15+00:00', 'Unoccupied', 8, 4, 'Present')
(7538.0, '2024-12-08T10:20:24+00:00', 'Present', 9, 3, 'Unoccupied')
(7538.0, '2024-12-08T10:20:36+00:00', 'Present', 10, 2, 'Present')
(7538.0, '2024-12-08T10:28:23+00:00', 'Present', 11, 1, 'Present')
(7539.0, '2024-10-11T02:41:57+00:00', 'Present', 1, 6, None)
(7539.0, '2024-10-11T03:47:33+00:00', 'Present', 2, 5, 'Present')
(7539.0, '2024-10-11T04:06:49+00:00', 'Unoccupied', 3, 4, 'Present')
(7539.0, '2024-10-11T04:15:11+00:00', 'Unoccupied', 4, 3, 'Unoccupied')
(7539.0, '2024-10-11T04:31:40+00:00', 'Unoccupied', 5, 2, 'Unoccupied')
(7539.0, '2024-10-11T05:45:34+00:00', 'Present', 6, 1, 'Unoccupied')
(7541.0, '2024-12-08T09:02:09+00:00', 'Present', 1, 5, None)
(7541.0, '2024-12-08T09:32:17+00:00', 'Unoccupied', 2, 4, 'Present')
(7541.0, '2024-12-08T09:32:37+00:00', 'Unoccupied', 3, 3, 'Unoccupied')
(7541.0, '2024-12-08T09:47:34+00:00', 'Present', 4, 2, 'Unoccupied')
(7541.0, '2024-12-08T10:12:28+00:00', 'Unoccupied', 5, 1, 'Present')
(7542.0, '2024-12-08T01:54:11+00:00', 'Unoccupied', 1, 7, None)
(7542.0, '2024-12-08T06:36:00+00:00', 'Unoccupied', 2, 6, 'Unoccupied')
(7542.0, '2024-12-08T06:40:23+00:00', 'Unoccupied', 3, 5, 'Unoccupied')
(7542.0, '2024-12-08T09:06:54+00:00', 'Unoccupied', 4, 4, 'Unoccupied')
(7542.0, '2024-12-08T09:08:57+00:00', 'Unoccupied', 5, 3, 'Unoccupied')
(7542.0, '2024-12-08T09:57:34+00:00', 'Unoccupied', 6, 2, 'Unoccupied')
(7542.0, '2024-12-08T10:07:05+00:00', 'Unoccupied', 7, 1, 'Unoccupied')
(7545.0, '2024-12-08T03:18:17+00:00', 'Unoccupied', 1, 1, None)
(7547.0, '2024-12-08T03:46:31+00:00', 'Present', 1, 25, None)
(7547.0, '2024-12-08T04:15:00+00:00', 'Present', 2, 24, 'Present')
(7547.0, '2024-12-08T06:49:53+00:00', 'Present', 3, 23, 'Present')
(7547.0, '2024-12-08T07:47:44+00:00', 'Present', 4, 22, 'Present')
(7547.0, '2024-12-08T08:44:01+00:00', 'Present', 5, 21, 'Present')
(7547.0, '2024-12-08T09:03:53+00:00', 'Present', 6, 20, 'Present')
(7547.0, '2024-12-08T09:04:15+00:00', 'Present', 7, 19, 'Present')
(7547.0, '2024-12-08T09:07:41+00:00', 'Present', 8, 18, 'Present')
(7547.0, '2024-12-08T09:10:14+00:00', 'Present', 9, 17, 'Present')
(7547.0, '2024-12-08T09:13:10+00:00', 'Present', 10, 16, 'Present')
(7547.0, '2024-12-08T09:25:26+00:00', 'Present', 11, 15, 'Present')
(7547.0, '2024-12-08T09:32:02+00:00', 'Present', 12, 14, 'Present')
(7547.0, '2024-12-08T09:39:26+00:00', 'Present', 13, 13, 'Present')
(7547.0, '2024-12-08T09:49:03+00:00', 'Present', 14, 12, 'Present')
(7547.0, '2024-12-08T09:49:58+00:00', 'Present', 15, 11, 'Present')
(7547.0, '2024-12-08T09:59:42+00:00', 'Present', 16, 10, 'Present')
(7547.0, '2024-12-08T10:00:25+00:00', 'Present', 17, 9, 'Present')
(7547.0, '2024-12-08T10:03:34+00:00', 'Present', 18, 8, 'Present')
(7547.0, '2024-12-08T10:12:14+00:00', 'Present', 19, 7, 'Present')
(7547.0, '2024-12-08T10:15:07+00:00', 'Present', 20, 6, 'Present')
(7547.0, '2024-12-08T10:15:40+00:00', 'Present', 21, 5, 'Present')
(7547.0, '2024-12-08T10:17:40+00:00', 'Present', 22, 4, 'Present')
(7547.0, '2024-12-08T10:19:08+00:00', 'Present', 23, 3, 'Present')
(7547.0, '2024-12-08T10:24:37+00:00', 'Unoccupied', 24, 2, 'Present')
(7547.0, '2024-12-08T10:31:27+00:00', 'Present', 25, 1, 'Unoccupied')
(7548.0, '2024-12-07T09:52:29+00:00', 'Present', 1, 11, None)
(7548.0, '2024-12-08T05:34:18+00:00', 'Unoccupied', 2, 10, 'Present')
(7548.0, '2024-12-08T08:00:38+00:00', 'Unoccupied', 3, 9, 'Unoccupied')
(7548.0, '2024-12-08T08:37:19+00:00', 'Unoccupied', 4, 8, 'Unoccupied')
(7548.0, '2024-12-08T08:44:56+00:00', 'Present', 5, 7, 'Unoccupied')
(7548.0, '2024-12-08T08:56:43+00:00', 'Present', 6, 6, 'Present')
(7548.0, '2024-12-08T10:09:51+00:00', 'Present', 7, 5, 'Present')
(7548.0, '2024-12-08T10:14:25+00:00', 'Unoccupied', 8, 4, 'Present')
(7548.0, '2024-12-08T10:16:47+00:00', 'Unoccupied', 9, 3, 'Unoccupied')
(7548.0, '2024-12-08T10:17:56+00:00', 'Unoccupied', 10, 2, 'Unoccupied')
(7548.0, '2024-12-08T10:27:50+00:00', 'Unoccupied', 11, 1, 'Unoccupied')
(7549.0, '2024-10-01T22:48:56+00:00', 'Unoccupied', 1, 22, None)
(7549.0, '2024-10-01T22:49:02+00:00', 'Present', 2, 21, 'Unoccupied')
(7549.0, '2024-10-01T22:53:36+00:00', 'Unoccupied', 3, 20, 'Present')
(7549.0, '2024-10-01T22:54:24+00:00', 'Present', 4, 19, 'Unoccupied')
(7549.0, '2024-10-01T22:58:33+00:00', 'Present', 5, 18, 'Present')
(7549.0, '2024-10-01T23:05:02+00:00', 'Unoccupied', 6, 17, 'Present')
(7549.0, '2024-10-01T23:13:32+00:00', 'Present', 7, 16, 'Unoccupied')
(7549.0, '2024-10-01T23:13:53+00:00', 'Unoccupied', 8, 15, 'Present')
(7549.0, '2024-10-01T23:17:12+00:00', 'Unoccupied', 9, 14, 'Unoccupied')
(7549.0, '2024-10-01T23:19:47+00:00', 'Present', 10, 13, 'Unoccupied')
(7549.0, '2024-10-01T23:26:43+00:00', 'Present', 11, 12, 'Present')
(7549.0, '2024-10-01T23:28:05+00:00', 'Present', 12, 11, 'Present')
(7549.0, '2024-10-01T23:28:21+00:00', 'Present', 13, 10, 'Present')
(7549.0, '2024-10-01T23:29:39+00:00', 'Present', 14, 9, 'Present')
(7549.0, '2024-10-01T23:36:17+00:00', 'Present', 15, 8, 'Present')
(7549.0, '2024-10-03T22:09:14+00:00', 'Present', 16, 7, 'Present')
(7549.0, '2024-10-11T03:34:19+00:00', 'Present', 17, 6, 'Present')
(7549.0, '2024-10-11T03:43:14+00:00', 'Present', 18, 5, 'Present')
(7549.0, '2024-10-11T03:47:55+00:00', 'Present', 19, 4, 'Present')
(7549.0, '2024-10-11T04:00:46+00:00', 'Present', 20, 3, 'Present')
(7549.0, '2024-10-11T04:57:59+00:00', 'Unoccupied', 21, 2, 'Present')
(7549.0, '2024-10-11T05:26:17+00:00', 'Present', 22, 1, 'Unoccupied')
(7550.0, '2024-10-01T22:33:54+00:00', 'Present', 1, 11, None)
(7550.0, '2024-10-01T22:50:25+00:00', 'Unoccupied', 2, 10, 'Present')
(7550.0, '2024-10-01T23:19:46+00:00', 'Present', 3, 9, 'Unoccupied')
(7550.0, '2024-10-01T23:22:55+00:00', 'Present', 4, 8, 'Present')
(7550.0, '2024-10-01T23:28:58+00:00', 'Present', 5, 7, 'Present')
(7550.0, '2024-10-01T23:32:50+00:00', 'Present', 6, 6, 'Present')
(7550.0, '2024-10-11T03:57:28+00:00', 'Present', 7, 5, 'Present')
(7550.0, '2024-10-11T05:10:42+00:00', 'Unoccupied', 8, 4, 'Present')
(7550.0, '2024-10-11T05:42:42+00:00', 'Unoccupied', 9, 3, 'Unoccupied')
(7550.0, '2024-10-11T05:43:59+00:00', 'Unoccupied', 10, 2, 'Unoccupied')
(7550.0, '2024-10-11T05:44:02+00:00', 'Unoccupied', 11, 1, 'Unoccupied')
(7551.0, '2024-12-08T07:05:03+00:00', 'Present', 1, 22, None)
(7551.0, '2024-12-08T07:07:20+00:00', 'Present', 2, 21, 'Present')
(7551.0, '2024-12-08T08:08:03+00:00', 'Present', 3, 20, 'Present')
(7551.0, '2024-12-08T08:19:37+00:00', 'Present', 4, 19, 'Present')
(7551.0, '2024-12-08T09:25:51+00:00', 'Present', 5, 18, 'Present')
(7551.0, '2024-12-08T09:26:31+00:00', 'Present', 6, 17, 'Present')
(7551.0, '2024-12-08T09:34:08+00:00', 'Present', 7, 16, 'Present')
(7551.0, '2024-12-08T09:34:31+00:00', 'Present', 8, 15, 'Present')
(7551.0, '2024-12-08T09:43:11+00:00', 'Present', 9, 14, 'Present')
(7551.0, '2024-12-08T09:44:17+00:00', 'Present', 10, 13, 'Present')
(7551.0, '2024-12-08T09:47:55+00:00', 'Present', 11, 12, 'Present')
(7551.0, '2024-12-08T09:52:29+00:00', 'Present', 12, 11, 'Present')
(7551.0, '2024-12-08T10:02:28+00:00', 'Present', 13, 10, 'Present')
(7551.0, '2024-12-08T10:02:37+00:00', 'Present', 14, 9, 'Present')
(7551.0, '2024-12-08T10:03:14+00:00', 'Present', 15, 8, 'Present')
(7551.0, '2024-12-08T10:14:21+00:00', 'Present', 16, 7, 'Present')
(7551.0, '2024-12-08T10:17:13+00:00', 'Present', 17, 6, 'Present')
(7551.0, '2024-12-08T10:20:56+00:00', 'Unoccupied', 18, 5, 'Present')
(7551.0, '2024-12-08T10:22:25+00:00', 'Unoccupied', 19, 4, 'Unoccupied')
(7551.0, '2024-12-08T10:23:44+00:00', 'Present', 20, 3, 'Unoccupied')
(7551.0, '2024-12-08T10:28:39+00:00', 'Present', 21, 2, 'Present')
(7551.0, '2024-12-08T10:28:57+00:00', 'Present', 22, 1, 'Present')
(7552.0, '2024-12-08T09:06:06+00:00', 'Present', 1, 8, None)
(7552.0, '2024-12-08T09:30:47+00:00', 'Present', 2, 7, 'Present')
(7552.0, '2024-12-08T09:41:21+00:00', 'Present', 3, 6, 'Present')
(7552.0, '2024-12-08T09:54:17+00:00', 'Present', 4, 5, 'Present')
(7552.0, '2024-12-08T10:17:58+00:00', 'Unoccupied', 5, 4, 'Present')
(7552.0, '2024-12-08T10:23:21+00:00', 'Present', 6, 3, 'Unoccupied')
(7552.0, '2024-12-08T10:24:05+00:00', 'Present', 7, 2, 'Present')
(7552.0, '2024-12-08T10:27:49+00:00', 'Unoccupied', 8, 1, 'Present')
(7553.0, '2024-12-08T04:55:43+00:00', 'Unoccupied', 1, 3, None)
(7553.0, '2024-12-08T07:11:42+00:00', 'Present', 2, 2, 'Unoccupied')
(7553.0, '2024-12-08T08:32:52+00:00', 'Present', 3, 1, 'Present')
(7554.0, '2024-12-08T08:58:34+00:00', 'Present', 1, 3, None)
(7554.0, '2024-12-08T09:56:19+00:00', 'Unoccupied', 2, 2, 'Present')
(7554.0, '2024-12-08T10:13:00+00:00', 'Present', 3, 1, 'Unoccupied')
(7556.0, '2024-12-08T06:39:51+00:00', 'Present', 1, 33, None)
(7556.0, '2024-12-08T06:59:20+00:00', 'Present', 2, 32, 'Present')
(7556.0, '2024-12-08T08:21:38+00:00', 'Present', 3, 31, 'Present')
(7556.0, '2024-12-08T08:50:24+00:00', 'Present', 4, 30, 'Present')
(7556.0, '2024-12-08T08:57:13+00:00', 'Present', 5, 29, 'Present')
(7556.0, '2024-12-08T08:59:51+00:00', 'Present', 6, 28, 'Present')
(7556.0, '2024-12-08T09:01:08+00:00', 'Present', 7, 27, 'Present')
(7556.0, '2024-12-08T09:02:53+00:00', 'Present', 8, 26, 'Present')
(7556.0, '2024-12-08T09:06:25+00:00', 'Present', 9, 25, 'Present')
(7556.0, '2024-12-08T09:08:59+00:00', 'Present', 10, 24, 'Present')
(7556.0, '2024-12-08T09:14:41+00:00', 'Present', 11, 23, 'Present')
(7556.0, '2024-12-08T09:16:18+00:00', 'Present', 12, 22, 'Present')
(7556.0, '2024-12-08T09:21:40+00:00', 'Present', 13, 21, 'Present')
(7556.0, '2024-12-08T09:36:37+00:00', 'Present', 14, 20, 'Present')
(7556.0, '2024-12-08T09:41:48+00:00', 'Present', 15, 19, 'Present')
(7556.0, '2024-12-08T09:41:53+00:00', 'Present', 16, 18, 'Present')
(7556.0, '2024-12-08T09:42:39+00:00', 'Present', 17, 17, 'Present')
(7556.0, '2024-12-08T10:00:51+00:00', 'Present', 18, 16, 'Present')
(7556.0, '2024-12-08T10:02:23+00:00', 'Present', 19, 15, 'Present')
(7556.0, '2024-12-08T10:08:05+00:00', 'Present', 20, 14, 'Present')
(7556.0, '2024-12-08T10:11:36+00:00', 'Present', 21, 13, 'Present')
(7556.0, '2024-12-08T10:15:01+00:00', 'Present', 22, 12, 'Present')
(7556.0, '2024-12-08T10:15:26+00:00', 'Unoccupied', 23, 11, 'Present')
(7556.0, '2024-12-08T10:17:13+00:00', 'Present', 24, 10, 'Unoccupied')
(7556.0, '2024-12-08T10:19:57+00:00', 'Unoccupied', 25, 9, 'Present')
(7556.0, '2024-12-08T10:20:05+00:00', 'Unoccupied', 26, 8, 'Unoccupied')
(7556.0, '2024-12-08T10:20:59+00:00', 'Present', 27, 7, 'Unoccupied')
(7556.0, '2024-12-08T10:22:26+00:00', 'Present', 28, 6, 'Present')
(7556.0, '2024-12-08T10:22:44+00:00', 'Present', 29, 5, 'Present')
(7556.0, '2024-12-08T10:25:41+00:00', 'Present', 30, 4, 'Present')
(7556.0, '2024-12-08T10:28:58+00:00', 'Present', 31, 3, 'Present')
(7556.0, '2024-12-08T10:30:29+00:00', 'Present', 32, 2, 'Present')
(7556.0, '2024-12-08T10:31:28+00:00', 'Present', 33, 1, 'Present')
(7557.0, '2024-12-08T09:09:18+00:00', 'Present', 1, 6, None)
(7557.0, '2024-12-08T09:40:23+00:00', 'Present', 2, 5, 'Present')
(7557.0, '2024-12-08T09:49:49+00:00', 'Present', 3, 4, 'Present')
(7557.0, '2024-12-08T09:51:47+00:00', 'Present', 4, 3, 'Present')
(7557.0, '2024-12-08T10:07:32+00:00', 'Present', 5, 2, 'Present')
(7557.0, '2024-12-08T10:30:26+00:00', 'Present', 6, 1, 'Present')
(7558.0, '2024-12-08T09:22:24+00:00', 'Present', 1, 7, None)
(7558.0, '2024-12-08T09:43:02+00:00', 'Present', 2, 6, 'Present')
(7558.0, '2024-12-08T09:59:27+00:00', 'Present', 3, 5, 'Present')
(7558.0, '2024-12-08T10:12:35+00:00', 'Present', 4, 4, 'Present')
(7558.0, '2024-12-08T10:24:16+00:00', 'Unoccupied', 5, 3, 'Present')
(7558.0, '2024-12-08T10:30:02+00:00', 'Unoccupied', 6, 2, 'Unoccupied')
(7558.0, '2024-12-08T10:30:16+00:00', 'Present', 7, 1, 'Unoccupied')
(7559.0, '2024-12-08T08:08:02+00:00', 'Present', 1, 6, None)
(7559.0, '2024-12-08T08:20:10+00:00', 'Present', 2, 5, 'Present')
(7559.0, '2024-12-08T09:31:57+00:00', 'Present', 3, 4, 'Present')
(7559.0, '2024-12-08T09:38:11+00:00', 'Present', 4, 3, 'Present')
(7559.0, '2024-12-08T10:11:02+00:00', 'Unoccupied', 5, 2, 'Present')
(7559.0, '2024-12-08T10:24:45+00:00', 'Unoccupied', 6, 1, 'Unoccupied')
(7560.0, '2024-12-08T08:07:47+00:00', 'Present', 1, 5, None)
(7560.0, '2024-12-08T08:50:19+00:00', 'Present', 2, 4, 'Present')
(7560.0, '2024-12-08T09:04:57+00:00', 'Present', 3, 3, 'Present')
(7560.0, '2024-12-08T09:23:48+00:00', 'Present', 4, 2, 'Present')
(7560.0, '2024-12-08T09:46:55+00:00', 'Present', 5, 1, 'Present')
(7561.0, '2024-12-08T01:59:47+00:00', 'Unoccupied', 1, 8, None)
(7561.0, '2024-12-08T04:37:30+00:00', 'Unoccupied', 2, 7, 'Unoccupied')
(7561.0, '2024-12-08T07:57:39+00:00', 'Present', 3, 6, 'Unoccupied')
(7561.0, '2024-12-08T08:02:21+00:00', 'Present', 4, 5, 'Present')
(7561.0, '2024-12-08T09:13:06+00:00', 'Unoccupied', 5, 4, 'Present')
(7561.0, '2024-12-08T09:35:09+00:00', 'Unoccupied', 6, 3, 'Unoccupied')
(7561.0, '2024-12-08T09:49:45+00:00', 'Present', 7, 2, 'Unoccupied')
(7561.0, '2024-12-08T10:05:16+00:00', 'Present', 8, 1, 'Present')
(7563.0, '2024-12-07T18:23:05+00:00', 'Unoccupied', 1, 8, None)
(7563.0, '2024-12-08T04:38:06+00:00', 'Unoccupied', 2, 7, 'Unoccupied')
(7563.0, '2024-12-08T07:56:14+00:00', 'Unoccupied', 3, 6, 'Unoccupied')
(7563.0, '2024-12-08T08:57:22+00:00', 'Unoccupied', 4, 5, 'Unoccupied')
(7563.0, '2024-12-08T10:02:25+00:00', 'Present', 5, 4, 'Unoccupied')
(7563.0, '2024-12-08T10:13:07+00:00', 'Present', 6, 3, 'Present')
(7563.0, '2024-12-08T10:20:43+00:00', 'Unoccupied', 7, 2, 'Present')
(7563.0, '2024-12-08T10:21:35+00:00', 'Unoccupied', 8, 1, 'Unoccupied')
(7566.0, '2024-06-11T01:35:56+00:00', 'Unoccupied', 1, 48, None)
(7566.0, '2024-10-15T02:42:59+00:00', 'Unoccupied', 2, 47, 'Unoccupied')
(7566.0, '2024-10-15T03:16:41+00:00', 'Unoccupied', 3, 46, 'Unoccupied')
(7566.0, '2024-10-15T03:37:42+00:00', 'Unoccupied', 4, 45, 'Unoccupied')
(7566.0, '2024-10-15T04:03:47+00:00', 'Unoccupied', 5, 44, 'Unoccupied')
(7566.0, '2024-10-15T05:07:33+00:00', 'Unoccupied', 6, 43, 'Unoccupied')
(7566.0, '2024-10-15T05:14:38+00:00', 'Unoccupied', 7, 42, 'Unoccupied')
(7566.0, '2024-10-15T06:04:04+00:00', 'Unoccupied', 8, 41, 'Unoccupied')
(7566.0, '2024-10-15T06:08:39+00:00', 'Unoccupied', 9, 40, 'Unoccupied')
(7566.0, '2024-10-15T06:22:44+00:00', 'Unoccupied', 10, 39, 'Unoccupied')
(7566.0, '2024-10-15T06:48:24+00:00', 'Unoccupied', 11, 38, 'Unoccupied')
(7566.0, '2024-10-15T06:55:12+00:00', 'Unoccupied', 12, 37, 'Unoccupied')
(7566.0, '2024-10-15T07:34:21+00:00', 'Unoccupied', 13, 36, 'Unoccupied')
(7566.0, '2024-10-15T07:44:43+00:00', 'Unoccupied', 14, 35, 'Unoccupied')
(7566.0, '2024-10-15T07:53:00+00:00', 'Unoccupied', 15, 34, 'Unoccupied')
(7566.0, '2024-10-15T08:08:34+00:00', 'Unoccupied', 16, 33, 'Unoccupied')
(7566.0, '2024-10-15T08:17:36+00:00', 'Unoccupied', 17, 32, 'Unoccupied')
(7566.0, '2024-10-15T08:35:29+00:00', 'Unoccupied', 18, 31, 'Unoccupied')
(7566.0, '2024-10-15T08:39:43+00:00', 'Unoccupied', 19, 30, 'Unoccupied')
(7566.0, '2024-10-15T09:14:53+00:00', 'Unoccupied', 20, 29, 'Unoccupied')
(7566.0, '2024-10-15T09:25:15+00:00', 'Unoccupied', 21, 28, 'Unoccupied')
(7566.0, '2024-10-15T11:05:11+00:00', 'Unoccupied', 22, 27, 'Unoccupied')
(7566.0, '2024-10-15T11:17:23+00:00', 'Unoccupied', 23, 26, 'Unoccupied')
(7566.0, '2024-10-15T11:42:49+00:00', 'Unoccupied', 24, 25, 'Unoccupied')
(7566.0, '2024-10-15T11:49:17+00:00', 'Unoccupied', 25, 24, 'Unoccupied')
(7566.0, '2024-10-15T12:05:20+00:00', 'Unoccupied', 26, 23, 'Unoccupied')
(7566.0, '2024-10-15T12:27:12+00:00', 'Unoccupied', 27, 22, 'Unoccupied')
(7566.0, '2024-10-15T12:27:17+00:00', 'Unoccupied', 28, 21, 'Unoccupied')
(7566.0, '2024-10-15T12:55:02+00:00', 'Unoccupied', 29, 20, 'Unoccupied')
(7566.0, '2024-10-15T18:12:37+00:00', 'Unoccupied', 30, 19, 'Unoccupied')
(7566.0, '2024-10-15T18:31:21+00:00', 'Unoccupied', 31, 18, 'Unoccupied')
(7566.0, '2024-10-15T18:34:01+00:00', 'Unoccupied', 32, 17, 'Unoccupied')
(7566.0, '2024-10-15T19:09:51+00:00', 'Unoccupied', 33, 16, 'Unoccupied')
(7566.0, '2024-10-15T19:20:52+00:00', 'Unoccupied', 34, 15, 'Unoccupied')
(7566.0, '2024-10-15T19:20:53+00:00', 'Unoccupied', 35, 14, 'Unoccupied')
(7566.0, '2024-10-15T19:54:26+00:00', 'Present', 36, 13, 'Unoccupied')
(7566.0, '2024-10-15T20:01:54+00:00', 'Unoccupied', 37, 12, 'Present')
(7566.0, '2024-10-15T20:10:48+00:00', 'Present', 38, 11, 'Unoccupied')
(7566.0, '2024-10-15T20:39:19+00:00', 'Unoccupied', 39, 10, 'Present')
(7566.0, '2024-10-15T21:05:41+00:00', 'Present', 40, 9, 'Unoccupied')
(7566.0, '2024-10-15T21:19:12+00:00', 'Unoccupied', 41, 8, 'Present')
(7566.0, '2024-10-15T21:20:38+00:00', 'Present', 42, 7, 'Unoccupied')
(7566.0, '2024-10-15T21:21:47+00:00', 'Present', 43, 6, 'Present')
(7566.0, '2024-11-23T16:54:27+00:00', 'Unoccupied', 44, 5, 'Present')
(7566.0, '2024-11-23T20:47:40+00:00', 'Unoccupied', 45, 4, 'Unoccupied')
(7566.0, '2024-11-24T12:44:01+00:00', 'Present', 46, 3, 'Unoccupied')
(7566.0, '2024-12-03T15:31:15+00:00', 'Unoccupied', 47, 2, 'Present')
(7566.0, '2024-12-06T20:08:10+00:00', 'Unoccupied', 48, 1, 'Unoccupied')
(7568.0, '2024-06-13T03:56:06+00:00', 'Present', 1, 6, None)
(7568.0, '2024-12-08T09:48:54+00:00', 'Present', 2, 5, 'Present')
(7568.0, '2024-12-08T09:50:39+00:00', 'Present', 3, 4, 'Present')
(7568.0, '2024-12-08T09:51:56+00:00', 'Present', 4, 3, 'Present')
(7568.0, '2024-12-08T09:55:17+00:00', 'Present', 5, 2, 'Present')
(7568.0, '2024-12-08T10:05:50+00:00', 'Present', 6, 1, 'Present')
(7569.0, '2024-12-08T07:19:22+00:00', 'Present', 1, 7, None)
(7569.0, '2024-12-08T07:58:58+00:00', 'Present', 2, 6, 'Present')
(7569.0, '2024-12-08T08:29:09+00:00', 'Present', 3, 5, 'Present')
(7569.0, '2024-12-08T09:39:46+00:00', 'Present', 4, 4, 'Present')
(7569.0, '2024-12-08T09:55:45+00:00', 'Present', 5, 3, 'Present')
(7569.0, '2024-12-08T10:26:58+00:00', 'Present', 6, 2, 'Present')
(7569.0, '2024-12-08T10:31:20+00:00', 'Unoccupied', 7, 1, 'Present')
(7570.0, '2024-12-08T02:33:32+00:00', 'Present', 1, 37, None)
(7570.0, '2024-12-08T05:57:27+00:00', 'Present', 2, 36, 'Present')
(7570.0, '2024-12-08T07:34:27+00:00', 'Present', 3, 35, 'Present')
(7570.0, '2024-12-08T08:30:02+00:00', 'Present', 4, 34, 'Present')
(7570.0, '2024-12-08T08:32:26+00:00', 'Present', 5, 33, 'Present')
(7570.0, '2024-12-08T08:38:04+00:00', 'Present', 6, 32, 'Present')
(7570.0, '2024-12-08T08:46:45+00:00', 'Present', 7, 31, 'Present')
(7570.0, '2024-12-08T08:48:05+00:00', 'Present', 8, 30, 'Present')
(7570.0, '2024-12-08T08:49:49+00:00', 'Present', 9, 29, 'Present')
(7570.0, '2024-12-08T08:54:17+00:00', 'Present', 10, 28, 'Present')
(7570.0, '2024-12-08T08:57:09+00:00', 'Present', 11, 27, 'Present')
(7570.0, '2024-12-08T08:59:13+00:00', 'Present', 12, 26, 'Present')
(7570.0, '2024-12-08T09:11:33+00:00', 'Present', 13, 25, 'Present')
(7570.0, '2024-12-08T09:24:38+00:00', 'Present', 14, 24, 'Present')
(7570.0, '2024-12-08T09:24:45+00:00', 'Present', 15, 23, 'Present')
(7570.0, '2024-12-08T09:37:53+00:00', 'Present', 16, 22, 'Present')
(7570.0, '2024-12-08T09:39:45+00:00', 'Present', 17, 21, 'Present')
(7570.0, '2024-12-08T09:45:26+00:00', 'Unoccupied', 18, 20, 'Present')
(7570.0, '2024-12-08T09:48:46+00:00', 'Unoccupied', 19, 19, 'Unoccupied')
(7570.0, '2024-12-08T09:50:06+00:00', 'Unoccupied', 20, 18, 'Unoccupied')
(7570.0, '2024-12-08T09:52:40+00:00', 'Unoccupied', 21, 17, 'Unoccupied')
(7570.0, '2024-12-08T09:58:20+00:00', 'Unoccupied', 22, 16, 'Unoccupied')
(7570.0, '2024-12-08T09:58:52+00:00', 'Unoccupied', 23, 15, 'Unoccupied')
(7570.0, '2024-12-08T10:03:53+00:00', 'Present', 24, 14, 'Unoccupied')
(7570.0, '2024-12-08T10:14:04+00:00', 'Unoccupied', 25, 13, 'Present')
(7570.0, '2024-12-08T10:16:34+00:00', 'Present', 26, 12, 'Unoccupied')
(7570.0, '2024-12-08T10:19:24+00:00', 'Present', 27, 11, 'Present')
(7570.0, '2024-12-08T10:19:32+00:00', 'Present', 28, 10, 'Present')
(7570.0, '2024-12-08T10:19:36+00:00', 'Present', 29, 9, 'Present')
(7570.0, '2024-12-08T10:22:39+00:00', 'Unoccupied', 30, 8, 'Present')
(7570.0, '2024-12-08T10:22:54+00:00', 'Unoccupied', 31, 7, 'Unoccupied')
(7570.0, '2024-12-08T10:25:29+00:00', 'Unoccupied', 32, 6, 'Unoccupied')
(7570.0, '2024-12-08T10:27:22+00:00', 'Unoccupied', 33, 5, 'Unoccupied')
(7570.0, '2024-12-08T10:28:11+00:00', 'Unoccupied', 34, 4, 'Unoccupied')
(7570.0, '2024-12-08T10:29:32+00:00', 'Unoccupied', 35, 3, 'Unoccupied')
(7570.0, '2024-12-08T10:29:58+00:00', 'Present', 36, 2, 'Unoccupied')
(7570.0, '2024-12-08T10:31:34+00:00', 'Unoccupied', 37, 1, 'Present')
(7571.0, '2024-08-17T01:36:51+00:00', 'Unoccupied', 1, 34, None)
(7571.0, '2024-10-30T20:06:52+00:00', 'Present', 2, 33, 'Unoccupied')
(7571.0, '2024-12-07T20:24:00+00:00', 'Present', 3, 32, 'Present')
(7571.0, '2024-12-08T05:49:46+00:00', 'Unoccupied', 4, 31, 'Present')
(7571.0, '2024-12-08T06:13:23+00:00', 'Present', 5, 30, 'Unoccupied')
(7571.0, '2024-12-08T06:55:00+00:00', 'Present', 6, 29, 'Present')
(7571.0, '2024-12-08T07:59:57+00:00', 'Present', 7, 28, 'Present')
(7571.0, '2024-12-08T08:23:09+00:00', 'Present', 8, 27, 'Present')
(7571.0, '2024-12-08T08:30:42+00:00', 'Present', 9, 26, 'Present')
(7571.0, '2024-12-08T08:48:42+00:00', 'Unoccupied', 10, 25, 'Present')
(7571.0, '2024-12-08T08:58:03+00:00', 'Present', 11, 24, 'Unoccupied')
(7571.0, '2024-12-08T09:08:16+00:00', 'Present', 12, 23, 'Present')
(7571.0, '2024-12-08T09:13:03+00:00', 'Present', 13, 22, 'Present')
(7571.0, '2024-12-08T09:21:39+00:00', 'Present', 14, 21, 'Present')
(7571.0, '2024-12-08T09:34:46+00:00', 'Present', 15, 20, 'Present')
(7571.0, '2024-12-08T09:36:47+00:00', 'Present', 16, 19, 'Present')
(7571.0, '2024-12-08T09:40:13+00:00', 'Present', 17, 18, 'Present')
(7571.0, '2024-12-08T09:40:52+00:00', 'Present', 18, 17, 'Present')
(7571.0, '2024-12-08T09:43:36+00:00', 'Present', 19, 16, 'Present')
(7571.0, '2024-12-08T09:49:38+00:00', 'Present', 20, 15, 'Present')
(7571.0, '2024-12-08T09:57:58+00:00', 'Present', 21, 14, 'Present')
(7571.0, '2024-12-08T09:58:24+00:00', 'Present', 22, 13, 'Present')
(7571.0, '2024-12-08T09:59:45+00:00', 'Present', 23, 12, 'Present')
(7571.0, '2024-12-08T10:00:25+00:00', 'Unoccupied', 24, 11, 'Present')
(7571.0, '2024-12-08T10:17:04+00:00', 'Unoccupied', 25, 10, 'Unoccupied')
(7571.0, '2024-12-08T10:19:17+00:00', 'Present', 26, 9, 'Unoccupied')
(7571.0, '2024-12-08T10:20:52+00:00', 'Unoccupied', 27, 8, 'Present')
(7571.0, '2024-12-08T10:23:31+00:00', 'Present', 28, 7, 'Unoccupied')
(7571.0, '2024-12-08T10:26:17+00:00', 'Unoccupied', 29, 6, 'Present')
(7571.0, '2024-12-08T10:27:42+00:00', 'Present', 30, 5, 'Unoccupied')
(7571.0, '2024-12-08T10:30:19+00:00', 'Present', 31, 4, 'Present')
(7571.0, '2024-12-08T10:30:22+00:00', 'Unoccupied', 32, 3, 'Present')
(7571.0, '2024-12-08T10:30:34+00:00', 'Unoccupied', 33, 2, 'Unoccupied')
(7571.0, '2024-12-08T10:30:59+00:00', 'Unoccupied', 34, 1, 'Unoccupied')
(7572.0, '2024-12-08T08:52:34+00:00', 'Present', 1, 4, None)
(7572.0, '2024-12-08T09:13:01+00:00', 'Present', 2, 3, 'Present')
(7572.0, '2024-12-08T10:06:30+00:00', 'Present', 3, 2, 'Present')
(7572.0, '2024-12-08T10:15:16+00:00', 'Unoccupied', 4, 1, 'Present')
(7575.0, '2024-12-08T09:02:56+00:00', 'Present', 1, 5, None)
(7575.0, '2024-12-08T09:48:05+00:00', 'Present', 2, 4, 'Present')
(7575.0, '2024-12-08T10:04:09+00:00', 'Unoccupied', 3, 3, 'Present')
(7575.0, '2024-12-08T10:05:11+00:00', 'Present', 4, 2, 'Unoccupied')
(7575.0, '2024-12-08T10:29:05+00:00', 'Unoccupied', 5, 1, 'Present')
(7576.0, '2024-12-07T06:09:47+00:00', 'Unoccupied', 1, 4, None)
(7576.0, '2024-12-07T15:12:28+00:00', 'Unoccupied', 2, 3, 'Unoccupied')
(7576.0, '2024-12-08T10:13:22+00:00', 'Unoccupied', 3, 2, 'Unoccupied')
(7576.0, '2024-12-08T10:27:05+00:00', 'Unoccupied', 4, 1, 'Unoccupied')
(7577.0, '2024-12-08T06:42:30+00:00', 'Present', 1, 6, None)
(7577.0, '2024-12-08T09:55:58+00:00', 'Unoccupied', 2, 5, 'Present')
(7577.0, '2024-12-08T09:58:31+00:00', 'Present', 3, 4, 'Unoccupied')
(7577.0, '2024-12-08T10:21:41+00:00', 'Present', 4, 3, 'Present')
(7577.0, '2024-12-08T10:28:50+00:00', 'Present', 5, 2, 'Present')
(7577.0, '2024-12-08T10:31:03+00:00', 'Unoccupied', 6, 1, 'Present')
(7579.0, '2024-12-08T09:14:20+00:00', 'Present', 1, 4, None)
(7579.0, '2024-12-08T09:59:10+00:00', 'Present', 2, 3, 'Present')
(7579.0, '2024-12-08T10:13:29+00:00', 'Present', 3, 2, 'Present')
(7579.0, '2024-12-08T10:18:45+00:00', 'Present', 4, 1, 'Present')
(7584.0, '2024-12-08T04:08:18+00:00', 'Unoccupied', 1, 11, None)
(7584.0, '2024-12-08T04:22:42+00:00', 'Unoccupied', 2, 10, 'Unoccupied')
(7584.0, '2024-12-08T04:51:57+00:00', 'Unoccupied', 3, 9, 'Unoccupied')
(7584.0, '2024-12-08T04:57:37+00:00', 'Unoccupied', 4, 8, 'Unoccupied')
(7584.0, '2024-12-08T05:22:32+00:00', 'Unoccupied', 5, 7, 'Unoccupied')
(7584.0, '2024-12-08T05:50:50+00:00', 'Unoccupied', 6, 6, 'Unoccupied')
(7584.0, '2024-12-08T07:47:13+00:00', 'Present', 7, 5, 'Unoccupied')
(7584.0, '2024-12-08T07:48:30+00:00', 'Unoccupied', 8, 4, 'Present')
(7584.0, '2024-12-08T08:35:10+00:00', 'Unoccupied', 9, 3, 'Unoccupied')
(7584.0, '2024-12-08T09:03:18+00:00', 'Unoccupied', 10, 2, 'Unoccupied')
(7584.0, '2024-12-08T09:54:53+00:00', 'Present', 11, 1, 'Unoccupied')
(7586.0, '2024-05-01T09:50:54+00:00', 'Unoccupied', 1, 19, None)
(7586.0, '2024-12-08T01:34:02+00:00', 'Present', 2, 18, 'Unoccupied')
(7586.0, '2024-12-08T06:00:46+00:00', 'Unoccupied', 3, 17, 'Present')
(7586.0, '2024-12-08T07:06:10+00:00', 'Unoccupied', 4, 16, 'Unoccupied')
(7586.0, '2024-12-08T07:23:30+00:00', 'Unoccupied', 5, 15, 'Unoccupied')
(7586.0, '2024-12-08T07:34:06+00:00', 'Present', 6, 14, 'Unoccupied')
(7586.0, '2024-12-08T07:47:15+00:00', 'Present', 7, 13, 'Present')
(7586.0, '2024-12-08T08:34:14+00:00', 'Present', 8, 12, 'Present')
(7586.0, '2024-12-08T08:53:53+00:00', 'Unoccupied', 9, 11, 'Present')
(7586.0, '2024-12-08T09:03:29+00:00', 'Unoccupied', 10, 10, 'Unoccupied')
(7586.0, '2024-12-08T09:12:32+00:00', 'Unoccupied', 11, 9, 'Unoccupied')
(7586.0, '2024-12-08T09:20:50+00:00', 'Present', 12, 8, 'Unoccupied')
(7586.0, '2024-12-08T09:34:57+00:00', 'Unoccupied', 13, 7, 'Present')
(7586.0, '2024-12-08T09:35:46+00:00', 'Present', 14, 6, 'Unoccupied')
(7586.0, '2024-12-08T09:36:52+00:00', 'Present', 15, 5, 'Present')
(7586.0, '2024-12-08T09:54:10+00:00', 'Present', 16, 4, 'Present')
(7586.0, '2024-12-08T09:56:50+00:00', 'Present', 17, 3, 'Present')
(7586.0, '2024-12-08T10:01:13+00:00', 'Unoccupied', 18, 2, 'Present')
(7586.0, '2024-12-08T10:20:54+00:00', 'Present', 19, 1, 'Unoccupied')
(7591.0, '2024-12-08T10:03:48+00:00', 'Present', 1, 1, None)
(7592.0, '2024-12-08T06:22:26+00:00', 'Present', 1, 23, None)
(7592.0, '2024-12-08T08:03:18+00:00', 'Present', 2, 22, 'Present')
(7592.0, '2024-12-08T08:14:27+00:00', 'Present', 3, 21, 'Present')
(7592.0, '2024-12-08T08:42:29+00:00', 'Present', 4, 20, 'Present')
(7592.0, '2024-12-08T08:52:10+00:00', 'Present', 5, 19, 'Present')
(7592.0, '2024-12-08T08:54:42+00:00', 'Present', 6, 18, 'Present')
(7592.0, '2024-12-08T09:03:03+00:00', 'Present', 7, 17, 'Present')
(7592.0, '2024-12-08T09:03:14+00:00', 'Present', 8, 16, 'Present')
(7592.0, '2024-12-08T09:16:00+00:00', 'Present', 9, 15, 'Present')
(7592.0, '2024-12-08T09:33:16+00:00', 'Present', 10, 14, 'Present')
(7592.0, '2024-12-08T09:34:00+00:00', 'Present', 11, 13, 'Present')
(7592.0, '2024-12-08T09:42:22+00:00', 'Present', 12, 12, 'Present')
(7592.0, '2024-12-08T09:46:24+00:00', 'Present', 13, 11, 'Present')
(7592.0, '2024-12-08T09:50:51+00:00', 'Present', 14, 10, 'Present')
(7592.0, '2024-12-08T09:53:55+00:00', 'Present', 15, 9, 'Present')
(7592.0, '2024-12-08T10:20:21+00:00', 'Present', 16, 8, 'Present')
(7592.0, '2024-12-08T10:26:28+00:00', 'Present', 17, 7, 'Present')
(7592.0, '2024-12-08T10:28:51+00:00', 'Present', 18, 6, 'Present')
(7592.0, '2024-12-08T10:28:58+00:00', 'Present', 19, 5, 'Present')
(7592.0, '2024-12-08T10:30:12+00:00', 'Unoccupied', 20, 4, 'Present')
(7592.0, '2024-12-08T10:31:15+00:00', 'Unoccupied', 21, 3, 'Unoccupied')
(7592.0, '2024-12-08T10:31:45+00:00', 'Present', 22, 2, 'Unoccupied')
(7592.0, '2024-12-08T10:31:54+00:00', 'Unoccupied', 23, 1, 'Present')
(7593.0, '2024-12-08T08:42:33+00:00', 'Present', 1, 3, None)
(7593.0, '2024-12-08T09:11:07+00:00', 'Present', 2, 2, 'Present')
(7593.0, '2024-12-08T10:00:37+00:00', 'Present', 3, 1, 'Present')
(7594.0, '2024-12-08T06:50:49+00:00', 'Present', 1, 16, None)
(7594.0, '2024-12-08T08:20:00+00:00', 'Present', 2, 15, 'Present')
(7594.0, '2024-12-08T09:09:22+00:00', 'Present', 3, 14, 'Present')
(7594.0, '2024-12-08T09:21:11+00:00', 'Present', 4, 13, 'Present')
(7594.0, '2024-12-08T09:39:32+00:00', 'Unoccupied', 5, 12, 'Present')
(7594.0, '2024-12-08T09:41:01+00:00', 'Unoccupied', 6, 11, 'Unoccupied')
(7594.0, '2024-12-08T09:42:59+00:00', 'Present', 7, 10, 'Unoccupied')
(7594.0, '2024-12-08T09:44:26+00:00', 'Unoccupied', 8, 9, 'Present')
(7594.0, '2024-12-08T09:45:10+00:00', 'Unoccupied', 9, 8, 'Unoccupied')
(7594.0, '2024-12-08T09:46:30+00:00', 'Unoccupied', 10, 7, 'Unoccupied')
(7594.0, '2024-12-08T09:58:00+00:00', 'Unoccupied', 11, 6, 'Unoccupied')
(7594.0, '2024-12-08T10:04:24+00:00', 'Present', 12, 5, 'Unoccupied')
(7594.0, '2024-12-08T10:07:59+00:00', 'Unoccupied', 13, 4, 'Present')
(7594.0, '2024-12-08T10:13:27+00:00', 'Present', 14, 3, 'Unoccupied')
(7594.0, '2024-12-08T10:21:54+00:00', 'Present', 15, 2, 'Present')
(7594.0, '2024-12-08T10:31:25+00:00', 'Unoccupied', 16, 1, 'Present')
(7595.0, '2024-12-08T08:35:37+00:00', 'Present', 1, 13, None)
(7595.0, '2024-12-08T08:47:40+00:00', 'Unoccupied', 2, 12, 'Present')
(7595.0, '2024-12-08T08:54:32+00:00', 'Present', 3, 11, 'Unoccupied')
(7595.0, '2024-12-08T08:54:42+00:00', 'Unoccupied', 4, 10, 'Present')
(7595.0, '2024-12-08T08:57:56+00:00', 'Present', 5, 9, 'Unoccupied')
(7595.0, '2024-12-08T09:09:22+00:00', 'Present', 6, 8, 'Present')
(7595.0, '2024-12-08T09:10:35+00:00', 'Present', 7, 7, 'Present')
(7595.0, '2024-12-08T09:16:25+00:00', 'Unoccupied', 8, 6, 'Present')
(7595.0, '2024-12-08T09:38:51+00:00', 'Present', 9, 5, 'Unoccupied')
(7595.0, '2024-12-08T10:09:59+00:00', 'Present', 10, 4, 'Present')
(7595.0, '2024-12-08T10:16:39+00:00', 'Present', 11, 3, 'Present')
(7595.0, '2024-12-08T10:20:16+00:00', 'Unoccupied', 12, 2, 'Present')
(7595.0, '2024-12-08T10:20:40+00:00', 'Unoccupied', 13, 1, 'Unoccupied')
(7596.0, '2024-12-08T06:31:47+00:00', 'Present', 1, 9, None)
(7596.0, '2024-12-08T08:47:26+00:00', 'Present', 2, 8, 'Present')
(7596.0, '2024-12-08T09:28:53+00:00', 'Present', 3, 7, 'Present')
(7596.0, '2024-12-08T09:37:47+00:00', 'Present', 4, 6, 'Present')
(7596.0, '2024-12-08T09:39:27+00:00', 'Present', 5, 5, 'Present')
(7596.0, '2024-12-08T09:41:41+00:00', 'Present', 6, 4, 'Present')
(7596.0, '2024-12-08T09:55:20+00:00', 'Present', 7, 3, 'Present')
(7596.0, '2024-12-08T10:04:23+00:00', 'Present', 8, 2, 'Present')
(7596.0, '2024-12-08T10:28:09+00:00', 'Present', 9, 1, 'Present')
(7603.0, '2024-12-08T08:33:56+00:00', 'Present', 1, 7, None)
(7603.0, '2024-12-08T08:40:56+00:00', 'Present', 2, 6, 'Present')
(7603.0, '2024-12-08T08:51:09+00:00', 'Present', 3, 5, 'Present')
(7603.0, '2024-12-08T10:07:18+00:00', 'Present', 4, 4, 'Present')
(7603.0, '2024-12-08T10:08:28+00:00', 'Present', 5, 3, 'Present')
(7603.0, '2024-12-08T10:10:39+00:00', 'Present', 6, 2, 'Present')
(7603.0, '2024-12-08T10:29:58+00:00', 'Present', 7, 1, 'Present')
(7605.0, '2024-05-18T13:18:47+00:00', 'Unoccupied', 1, 17, None)
(7605.0, '2024-12-08T07:20:11+00:00', 'Present', 2, 16, 'Unoccupied')
(7605.0, '2024-12-08T07:57:10+00:00', 'Present', 3, 15, 'Present')
(7605.0, '2024-12-08T08:12:51+00:00', 'Present', 4, 14, 'Present')
(7605.0, '2024-12-08T08:58:25+00:00', 'Present', 5, 13, 'Present')
(7605.0, '2024-12-08T09:00:46+00:00', 'Present', 6, 12, 'Present')
(7605.0, '2024-12-08T09:05:07+00:00', 'Present', 7, 11, 'Present')
(7605.0, '2024-12-08T09:10:25+00:00', 'Present', 8, 10, 'Present')
(7605.0, '2024-12-08T09:28:41+00:00', 'Present', 9, 9, 'Present')
(7605.0, '2024-12-08T09:38:38+00:00', 'Present', 10, 8, 'Present')
(7605.0, '2024-12-08T09:39:37+00:00', 'Present', 11, 7, 'Present')
(7605.0, '2024-12-08T09:56:08+00:00', 'Present', 12, 6, 'Present')
(7605.0, '2024-12-08T10:00:56+00:00', 'Unoccupied', 13, 5, 'Present')
(7605.0, '2024-12-08T10:08:31+00:00', 'Present', 14, 4, 'Unoccupied')
(7605.0, '2024-12-08T10:18:49+00:00', 'Present', 15, 3, 'Present')
(7605.0, '2024-12-08T10:29:43+00:00', 'Present', 16, 2, 'Present')
(7605.0, '2024-12-08T10:30:32+00:00', 'Present', 17, 1, 'Present')
(7606.0, '2024-12-08T07:20:17+00:00', 'Present', 1, 2, None)
(7606.0, '2024-12-08T09:58:57+00:00', 'Unoccupied', 2, 1, 'Present')
(7607.0, '2024-12-08T09:42:44+00:00', 'Present', 1, 3, None)
(7607.0, '2024-12-08T10:14:26+00:00', 'Present', 2, 2, 'Present')
(7607.0, '2024-12-08T10:29:35+00:00', 'Unoccupied', 3, 1, 'Present')
(7608.0, '2024-12-08T09:10:58+00:00', 'Unoccupied', 1, 2, None)
(7608.0, '2024-12-08T09:31:21+00:00', 'Unoccupied', 2, 1, 'Unoccupied')
(7610.0, '2024-05-09T03:08:01+00:00', 'Present', 1, 24, None)
(7610.0, '2024-11-18T00:36:56+00:00', 'Unoccupied', 2, 23, 'Present')
(7610.0, '2024-12-08T05:45:53+00:00', 'Present', 3, 22, 'Unoccupied')
(7610.0, '2024-12-08T07:48:18+00:00', 'Present', 4, 21, 'Present')
(7610.0, '2024-12-08T07:59:58+00:00', 'Present', 5, 20, 'Present')
(7610.0, '2024-12-08T08:32:58+00:00', 'Present', 6, 19, 'Present')
(7610.0, '2024-12-08T08:50:40+00:00', 'Present', 7, 18, 'Present')
(7610.0, '2024-12-08T09:27:55+00:00', 'Present', 8, 17, 'Present')
(7610.0, '2024-12-08T09:32:39+00:00', 'Present', 9, 16, 'Present')
(7610.0, '2024-12-08T09:34:59+00:00', 'Present', 10, 15, 'Present')
(7610.0, '2024-12-08T09:35:41+00:00', 'Present', 11, 14, 'Present')
(7610.0, '2024-12-08T09:49:34+00:00', 'Present', 12, 13, 'Present')
(7610.0, '2024-12-08T09:50:57+00:00', 'Present', 13, 12, 'Present')
(7610.0, '2024-12-08T09:55:04+00:00', 'Unoccupied', 14, 11, 'Present')
(7610.0, '2024-12-08T09:59:23+00:00', 'Present', 15, 10, 'Unoccupied')
(7610.0, '2024-12-08T10:03:10+00:00', 'Unoccupied', 16, 9, 'Present')
(7610.0, '2024-12-08T10:17:59+00:00', 'Present', 17, 8, 'Unoccupied')
(7610.0, '2024-12-08T10:19:11+00:00', 'Unoccupied', 18, 6, 'Present')
(7610.0, '2024-12-08T10:19:11+00:00', 'Unoccupied', 19, 6, 'Unoccupied')
(7610.0, '2024-12-08T10:19:38+00:00', 'Present', 20, 5, 'Unoccupied')
(7610.0, '2024-12-08T10:27:19+00:00', 'Unoccupied', 21, 4, 'Present')
(7610.0, '2024-12-08T10:30:03+00:00', 'Present', 22, 3, 'Unoccupied')
(7610.0, '2024-12-08T10:31:09+00:00', 'Present', 23, 2, 'Present')
(7610.0, '2024-12-08T10:31:34+00:00', 'Present', 24, 1, 'Present')
(7611.0, '2024-12-08T01:07:57+00:00', 'Unoccupied', 1, 4, None)
(7611.0, '2024-12-08T08:45:37+00:00', 'Present', 2, 3, 'Unoccupied')
(7611.0, '2024-12-08T09:56:11+00:00', 'Unoccupied', 3, 2, 'Present')
(7611.0, '2024-12-08T10:09:11+00:00', 'Unoccupied', 4, 1, 'Unoccupied')
(7612.0, '2024-12-08T08:21:46+00:00', 'Unoccupied', 1, 5, None)
(7612.0, '2024-12-08T08:36:25+00:00', 'Present', 2, 4, 'Unoccupied')
(7612.0, '2024-12-08T09:37:57+00:00', 'Present', 3, 3, 'Present')
(7612.0, '2024-12-08T10:11:32+00:00', 'Unoccupied', 4, 2, 'Present')
(7612.0, '2024-12-08T10:20:28+00:00', 'Unoccupied', 5, 1, 'Unoccupied')
(7614.0, '2024-12-08T07:40:48+00:00', 'Present', 1, 15, None)
(7614.0, '2024-12-08T08:08:39+00:00', 'Present', 2, 14, 'Present')
(7614.0, '2024-12-08T08:55:48+00:00', 'Present', 3, 13, 'Present')
(7614.0, '2024-12-08T09:03:50+00:00', 'Present', 4, 12, 'Present')
(7614.0, '2024-12-08T09:17:26+00:00', 'Present', 5, 11, 'Present')
(7614.0, '2024-12-08T09:19:47+00:00', 'Present', 6, 10, 'Present')
(7614.0, '2024-12-08T09:39:39+00:00', 'Present', 7, 9, 'Present')
(7614.0, '2024-12-08T09:47:29+00:00', 'Present', 8, 8, 'Present')
(7614.0, '2024-12-08T09:57:47+00:00', 'Present', 9, 7, 'Present')
(7614.0, '2024-12-08T10:04:20+00:00', 'Present', 10, 6, 'Present')
(7614.0, '2024-12-08T10:14:00+00:00', 'Present', 11, 5, 'Present')
(7614.0, '2024-12-08T10:22:25+00:00', 'Unoccupied', 12, 4, 'Present')
(7614.0, '2024-12-08T10:24:20+00:00', 'Present', 13, 3, 'Unoccupied')
(7614.0, '2024-12-08T10:27:58+00:00', 'Present', 14, 2, 'Present')
(7614.0, '2024-12-08T10:29:58+00:00', 'Present', 15, 1, 'Present')
(7615.0, '2024-12-08T07:56:53+00:00', 'Present', 1, 2, None)
(7615.0, '2024-12-08T09:41:54+00:00', 'Present', 2, 1, 'Present')
(7621.0, '2024-12-07T19:10:20+00:00', 'Present', 1, 13, None)
(7621.0, '2024-12-08T06:54:10+00:00', 'Present', 2, 12, 'Present')
(7621.0, '2024-12-08T07:35:48+00:00', 'Unoccupied', 3, 11, 'Present')
(7621.0, '2024-12-08T08:38:45+00:00', 'Present', 4, 10, 'Unoccupied')
(7621.0, '2024-12-08T09:05:36+00:00', 'Unoccupied', 5, 9, 'Present')
(7621.0, '2024-12-08T09:16:32+00:00', 'Present', 6, 8, 'Unoccupied')
(7621.0, '2024-12-08T09:25:02+00:00', 'Present', 7, 7, 'Present')
(7621.0, '2024-12-08T09:36:06+00:00', 'Present', 8, 6, 'Present')
(7621.0, '2024-12-08T09:39:18+00:00', 'Present', 9, 5, 'Present')
(7621.0, '2024-12-08T09:57:08+00:00', 'Present', 10, 4, 'Present')
(7621.0, '2024-12-08T10:03:07+00:00', 'Present', 11, 3, 'Present')
(7621.0, '2024-12-08T10:07:46+00:00', 'Present', 12, 2, 'Present')
(7621.0, '2024-12-08T10:20:52+00:00', 'Present', 13, 1, 'Present')
(7622.0, '2024-12-08T09:09:01+00:00', 'Present', 1, 2, None)
(7622.0, '2024-12-08T10:09:57+00:00', 'Present', 2, 1, 'Present')
(7623.0, '2024-12-08T09:36:41+00:00', 'Present', 1, 3, None)
(7623.0, '2024-12-08T09:47:16+00:00', 'Present', 2, 2, 'Present')
(7623.0, '2024-12-08T10:17:19+00:00', 'Present', 3, 1, 'Present')
(7624.0, '2024-11-29T05:17:17+00:00', 'Unoccupied', 1, 10, None)
(7624.0, '2024-12-05T06:32:14+00:00', 'Unoccupied', 2, 9, 'Unoccupied')
(7624.0, '2024-12-05T11:41:02+00:00', 'Unoccupied', 3, 8, 'Unoccupied')
(7624.0, '2024-12-07T03:10:57+00:00', 'Unoccupied', 4, 7, 'Unoccupied')
(7624.0, '2024-12-07T11:45:26+00:00', 'Unoccupied', 5, 6, 'Unoccupied')
(7624.0, '2024-12-08T04:21:13+00:00', 'Present', 6, 5, 'Unoccupied')
(7624.0, '2024-12-08T08:25:35+00:00', 'Present', 7, 4, 'Present')
(7624.0, '2024-12-08T09:30:26+00:00', 'Present', 8, 3, 'Present')
(7624.0, '2024-12-08T10:06:38+00:00', 'Unoccupied', 9, 2, 'Present')
(7624.0, '2024-12-08T10:20:55+00:00', 'Unoccupied', 10, 1, 'Unoccupied')
(7625.0, '2024-12-08T09:00:30+00:00', 'Present', 1, 6, None)
(7625.0, '2024-12-08T09:25:40+00:00', 'Present', 2, 5, 'Present')
(7625.0, '2024-12-08T09:51:54+00:00', 'Present', 3, 4, 'Present')
(7625.0, '2024-12-08T10:00:23+00:00', 'Present', 4, 3, 'Present')
(7625.0, '2024-12-08T10:24:14+00:00', 'Present', 5, 2, 'Present')
(7625.0, '2024-12-08T10:28:52+00:00', 'Present', 6, 1, 'Present')
(7626.0, '2024-12-08T08:38:24+00:00', 'Present', 1, 5, None)
(7626.0, '2024-12-08T09:21:17+00:00', 'Present', 2, 4, 'Present')
(7626.0, '2024-12-08T10:06:05+00:00', 'Present', 3, 3, 'Present')
(7626.0, '2024-12-08T10:08:06+00:00', 'Present', 4, 2, 'Present')
(7626.0, '2024-12-08T10:23:38+00:00', 'Present', 5, 1, 'Present')
(7627.0, '2024-12-08T07:45:47+00:00', 'Present', 1, 4, None)
(7627.0, '2024-12-08T09:20:54+00:00', 'Present', 2, 3, 'Present')
(7627.0, '2024-12-08T10:13:25+00:00', 'Present', 3, 2, 'Present')
(7627.0, '2024-12-08T10:31:38+00:00', 'Present', 4, 1, 'Present')
(7628.0, '2024-12-03T21:00:34+00:00', 'Unoccupied', 1, 9, None)
(7628.0, '2024-12-07T04:31:22+00:00', 'Present', 2, 8, 'Unoccupied')
(7628.0, '2024-12-08T03:45:27+00:00', 'Present', 3, 7, 'Present')
(7628.0, '2024-12-08T09:51:59+00:00', 'Present', 4, 6, 'Present')
(7628.0, '2024-12-08T10:06:54+00:00', 'Present', 5, 5, 'Present')
(7628.0, '2024-12-08T10:15:15+00:00', 'Present', 6, 4, 'Present')
(7628.0, '2024-12-08T10:22:11+00:00', 'Present', 7, 3, 'Present')
(7628.0, '2024-12-08T10:22:50+00:00', 'Present', 8, 2, 'Present')
(7628.0, '2024-12-08T10:31:30+00:00', 'Unoccupied', 9, 1, 'Present')
(7630.0, '2024-12-08T04:23:39+00:00', 'Present', 1, 13, None)
(7630.0, '2024-12-08T06:26:56+00:00', 'Present', 2, 12, 'Present')
(7630.0, '2024-12-08T06:41:15+00:00', 'Present', 3, 11, 'Present')
(7630.0, '2024-12-08T08:14:37+00:00', 'Present', 4, 10, 'Present')
(7630.0, '2024-12-08T08:26:32+00:00', 'Present', 5, 9, 'Present')
(7630.0, '2024-12-08T08:38:40+00:00', 'Present', 6, 8, 'Present')
(7630.0, '2024-12-08T08:41:08+00:00', 'Present', 7, 7, 'Present')
(7630.0, '2024-12-08T09:02:04+00:00', 'Present', 8, 6, 'Present')
(7630.0, '2024-12-08T09:24:33+00:00', 'Present', 9, 5, 'Present')
(7630.0, '2024-12-08T10:04:32+00:00', 'Present', 10, 4, 'Present')
(7630.0, '2024-12-08T10:09:12+00:00', 'Present', 11, 3, 'Present')
(7630.0, '2024-12-08T10:12:14+00:00', 'Present', 12, 2, 'Present')
(7630.0, '2024-12-08T10:15:58+00:00', 'Present', 13, 1, 'Present')
(7631.0, '2024-12-08T00:28:20+00:00', 'Present', 1, 4, None)
(7631.0, '2024-12-08T01:53:28+00:00', 'Unoccupied', 2, 3, 'Present')
(7631.0, '2024-12-08T03:31:45+00:00', 'Unoccupied', 3, 2, 'Unoccupied')
(7631.0, '2024-12-08T03:31:56+00:00', 'Present', 4, 1, 'Unoccupied')
(7633.0, '2024-12-08T04:14:12+00:00', 'Present', 1, 5, None)
(7633.0, '2024-12-08T10:14:01+00:00', 'Present', 2, 4, 'Present')
(7633.0, '2024-12-08T10:20:19+00:00', 'Present', 3, 3, 'Present')
(7633.0, '2024-12-08T10:28:07+00:00', 'Present', 4, 2, 'Present')
(7633.0, '2024-12-08T10:31:07+00:00', 'Unoccupied', 5, 1, 'Present')
(7634.0, '2024-12-07T06:59:46+00:00', 'Present', 1, 22, None)
(7634.0, '2024-12-08T06:34:37+00:00', 'Present', 2, 21, 'Present')
(7634.0, '2024-12-08T08:19:55+00:00', 'Present', 3, 20, 'Present')
(7634.0, '2024-12-08T08:23:35+00:00', 'Present', 4, 19, 'Present')
(7634.0, '2024-12-08T08:34:36+00:00', 'Present', 5, 18, 'Present')
(7634.0, '2024-12-08T08:43:38+00:00', 'Present', 6, 17, 'Present')
(7634.0, '2024-12-08T08:57:31+00:00', 'Present', 7, 16, 'Present')
(7634.0, '2024-12-08T09:03:31+00:00', 'Present', 8, 15, 'Present')
(7634.0, '2024-12-08T09:13:09+00:00', 'Present', 9, 14, 'Present')
(7634.0, '2024-12-08T09:22:56+00:00', 'Present', 10, 13, 'Present')
(7634.0, '2024-12-08T09:24:27+00:00', 'Present', 11, 12, 'Present')
(7634.0, '2024-12-08T09:32:11+00:00', 'Present', 12, 11, 'Present')
(7634.0, '2024-12-08T09:40:45+00:00', 'Present', 13, 10, 'Present')
(7634.0, '2024-12-08T09:40:57+00:00', 'Present', 14, 9, 'Present')
(7634.0, '2024-12-08T09:44:28+00:00', 'Present', 15, 8, 'Present')
(7634.0, '2024-12-08T09:58:26+00:00', 'Present', 16, 7, 'Present')
(7634.0, '2024-12-08T10:00:27+00:00', 'Present', 17, 6, 'Present')
(7634.0, '2024-12-08T10:07:25+00:00', 'Present', 18, 5, 'Present')
(7634.0, '2024-12-08T10:10:59+00:00', 'Present', 19, 4, 'Present')
(7634.0, '2024-12-08T10:11:55+00:00', 'Present', 20, 3, 'Present')
(7634.0, '2024-12-08T10:14:16+00:00', 'Present', 21, 2, 'Present')
(7634.0, '2024-12-08T10:23:33+00:00', 'Present', 22, 1, 'Present')
(7635.0, '2024-12-08T08:29:32+00:00', 'Present', 1, 4, None)
(7635.0, '2024-12-08T09:01:18+00:00', 'Present', 2, 3, 'Present')
(7635.0, '2024-12-08T10:16:49+00:00', 'Present', 3, 2, 'Present')
(7635.0, '2024-12-08T10:19:01+00:00', 'Unoccupied', 4, 1, 'Present')
(7636.0, '2024-12-08T07:46:56+00:00', 'Present', 1, 9, None)
(7636.0, '2024-12-08T08:57:17+00:00', 'Present', 2, 8, 'Present')
(7636.0, '2024-12-08T08:58:19+00:00', 'Present', 3, 7, 'Present')
(7636.0, '2024-12-08T09:14:33+00:00', 'Present', 4, 6, 'Present')
(7636.0, '2024-12-08T09:36:45+00:00', 'Present', 5, 5, 'Present')
(7636.0, '2024-12-08T09:40:24+00:00', 'Present', 6, 4, 'Present')
(7636.0, '2024-12-08T09:45:14+00:00', 'Present', 7, 3, 'Present')
(7636.0, '2024-12-08T09:53:50+00:00', 'Present', 8, 2, 'Present')
(7636.0, '2024-12-08T09:56:24+00:00', 'Present', 9, 1, 'Present')
(7637.0, '2024-12-08T09:26:13+00:00', 'Present', 1, 3, None)
(7637.0, '2024-12-08T09:37:29+00:00', 'Present', 2, 2, 'Present')
(7637.0, '2024-12-08T09:52:23+00:00', 'Present', 3, 1, 'Present')
(7638.0, '2024-12-08T05:47:59+00:00', 'Present', 1, 17, None)
(7638.0, '2024-12-08T07:17:40+00:00', 'Present', 2, 16, 'Present')
(7638.0, '2024-12-08T07:26:47+00:00', 'Present', 3, 15, 'Present')
(7638.0, '2024-12-08T07:45:19+00:00', 'Present', 4, 14, 'Present')
(7638.0, '2024-12-08T08:14:27+00:00', 'Present', 5, 13, 'Present')
(7638.0, '2024-12-08T09:05:58+00:00', 'Present', 6, 12, 'Present')
(7638.0, '2024-12-08T09:29:01+00:00', 'Present', 7, 11, 'Present')
(7638.0, '2024-12-08T09:57:26+00:00', 'Present', 8, 10, 'Present')
(7638.0, '2024-12-08T09:58:39+00:00', 'Present', 9, 9, 'Present')
(7638.0, '2024-12-08T10:00:26+00:00', 'Present', 10, 8, 'Present')
(7638.0, '2024-12-08T10:12:28+00:00', 'Present', 11, 7, 'Present')
(7638.0, '2024-12-08T10:12:59+00:00', 'Present', 12, 6, 'Present')
(7638.0, '2024-12-08T10:16:09+00:00', 'Present', 13, 5, 'Present')
(7638.0, '2024-12-08T10:19:15+00:00', 'Present', 14, 4, 'Present')
(7638.0, '2024-12-08T10:20:56+00:00', 'Present', 15, 3, 'Present')
(7638.0, '2024-12-08T10:28:02+00:00', 'Present', 16, 2, 'Present')
(7638.0, '2024-12-08T10:31:32+00:00', 'Present', 17, 1, 'Present')
(7639.0, '2024-12-08T06:30:46+00:00', 'Present', 1, 18, None)
(7639.0, '2024-12-08T08:19:23+00:00', 'Present', 2, 17, 'Present')
(7639.0, '2024-12-08T08:39:10+00:00', 'Unoccupied', 3, 16, 'Present')
(7639.0, '2024-12-08T08:43:48+00:00', 'Present', 4, 15, 'Unoccupied')
(7639.0, '2024-12-08T08:47:45+00:00', 'Present', 5, 14, 'Present')
(7639.0, '2024-12-08T08:53:42+00:00', 'Present', 6, 13, 'Present')
(7639.0, '2024-12-08T09:01:20+00:00', 'Present', 7, 12, 'Present')
(7639.0, '2024-12-08T09:10:39+00:00', 'Present', 8, 11, 'Present')
(7639.0, '2024-12-08T09:15:12+00:00', 'Present', 9, 10, 'Present')
(7639.0, '2024-12-08T09:22:31+00:00', 'Present', 10, 9, 'Present')
(7639.0, '2024-12-08T09:28:54+00:00', 'Present', 11, 8, 'Present')
(7639.0, '2024-12-08T09:36:50+00:00', 'Present', 12, 7, 'Present')
(7639.0, '2024-12-08T09:53:50+00:00', 'Present', 13, 6, 'Present')
(7639.0, '2024-12-08T09:57:04+00:00', 'Present', 14, 5, 'Present')
(7639.0, '2024-12-08T10:01:12+00:00', 'Present', 15, 4, 'Present')
(7639.0, '2024-12-08T10:05:26+00:00', 'Present', 16, 3, 'Present')
(7639.0, '2024-12-08T10:15:07+00:00', 'Present', 17, 2, 'Present')
(7639.0, '2024-12-08T10:30:21+00:00', 'Present', 18, 1, 'Present')
(7640.0, '2024-12-08T08:30:11+00:00', 'Present', 1, 8, None)
(7640.0, '2024-12-08T08:45:36+00:00', 'Present', 2, 7, 'Present')
(7640.0, '2024-12-08T09:42:37+00:00', 'Present', 3, 6, 'Present')
(7640.0, '2024-12-08T09:50:04+00:00', 'Present', 4, 5, 'Present')
(7640.0, '2024-12-08T09:52:06+00:00', 'Present', 5, 4, 'Present')
(7640.0, '2024-12-08T09:56:13+00:00', 'Present', 6, 3, 'Present')
(7640.0, '2024-12-08T10:16:49+00:00', 'Present', 7, 2, 'Present')
(7640.0, '2024-12-08T10:31:13+00:00', 'Present', 8, 1, 'Present')
(7642.0, '2024-12-08T07:35:46+00:00', 'Present', 1, 4, None)
(7642.0, '2024-12-08T09:34:36+00:00', 'Present', 2, 3, 'Present')
(7642.0, '2024-12-08T09:49:49+00:00', 'Unoccupied', 3, 2, 'Present')
(7642.0, '2024-12-08T10:31:42+00:00', 'Unoccupied', 4, 1, 'Unoccupied')
(7643.0, '2024-12-08T08:05:06+00:00', 'Unoccupied', 1, 6, None)
(7643.0, '2024-12-08T08:31:45+00:00', 'Unoccupied', 2, 5, 'Unoccupied')
(7643.0, '2024-12-08T09:12:28+00:00', 'Unoccupied', 3, 4, 'Unoccupied')
(7643.0, '2024-12-08T09:22:03+00:00', 'Unoccupied', 4, 3, 'Unoccupied')
(7643.0, '2024-12-08T09:22:13+00:00', 'Present', 5, 2, 'Unoccupied')
(7643.0, '2024-12-08T10:08:47+00:00', 'Present', 6, 1, 'Present')
(7644.0, '2024-12-08T05:13:47+00:00', 'Present', 1, 5, None)
(7644.0, '2024-12-08T09:19:03+00:00', 'Present', 2, 4, 'Present')
(7644.0, '2024-12-08T09:38:14+00:00', 'Present', 3, 3, 'Present')
(7644.0, '2024-12-08T09:54:14+00:00', 'Present', 4, 2, 'Present')
(7644.0, '2024-12-08T10:18:09+00:00', 'Present', 5, 1, 'Present')
(7645.0, '2024-12-08T06:21:43+00:00', 'Present', 1, 8, None)
(7645.0, '2024-12-08T08:26:25+00:00', 'Present', 2, 7, 'Present')
(7645.0, '2024-12-08T09:01:28+00:00', 'Present', 3, 6, 'Present')
(7645.0, '2024-12-08T09:10:07+00:00', 'Present', 4, 5, 'Present')
(7645.0, '2024-12-08T09:50:19+00:00', 'Present', 5, 4, 'Present')
(7645.0, '2024-12-08T10:10:57+00:00', 'Unoccupied', 6, 3, 'Present')
(7645.0, '2024-12-08T10:15:21+00:00', 'Unoccupied', 7, 2, 'Unoccupied')
(7645.0, '2024-12-08T10:18:08+00:00', 'Unoccupied', 8, 1, 'Unoccupied')
(7646.0, '2024-12-08T10:00:39+00:00', 'Present', 1, 3, None)
(7646.0, '2024-12-08T10:18:35+00:00', 'Present', 2, 2, 'Present')
(7646.0, '2024-12-08T10:30:52+00:00', 'Unoccupied', 3, 1, 'Present')
(7647.0, '2024-12-08T06:23:45+00:00', 'Present', 1, 14, None)
(7647.0, '2024-12-08T07:29:56+00:00', 'Present', 2, 13, 'Present')
(7647.0, '2024-12-08T08:07:24+00:00', 'Present', 3, 12, 'Present')
(7647.0, '2024-12-08T08:13:40+00:00', 'Present', 4, 11, 'Present')
(7647.0, '2024-12-08T08:18:06+00:00', 'Present', 5, 10, 'Present')
(7647.0, '2024-12-08T09:48:41+00:00', 'Present', 6, 9, 'Present')
(7647.0, '2024-12-08T09:58:35+00:00', 'Present', 7, 8, 'Present')
(7647.0, '2024-12-08T10:00:44+00:00', 'Present', 8, 7, 'Present')
(7647.0, '2024-12-08T10:08:14+00:00', 'Unoccupied', 9, 6, 'Present')
(7647.0, '2024-12-08T10:08:52+00:00', 'Present', 10, 5, 'Unoccupied')
(7647.0, '2024-12-08T10:09:52+00:00', 'Unoccupied', 11, 4, 'Present')
(7647.0, '2024-12-08T10:17:27+00:00', 'Unoccupied', 12, 3, 'Unoccupied')
(7647.0, '2024-12-08T10:28:00+00:00', 'Unoccupied', 13, 2, 'Unoccupied')
(7647.0, '2024-12-08T10:28:21+00:00', 'Unoccupied', 14, 1, 'Unoccupied')
(7648.0, '2024-12-07T04:23:03+00:00', 'Present', 1, 8, None)
(7648.0, '2024-12-08T00:05:49+00:00', 'Present', 2, 7, 'Present')
(7648.0, '2024-12-08T08:58:04+00:00', 'Present', 3, 6, 'Present')
(7648.0, '2024-12-08T08:59:22+00:00', 'Present', 4, 5, 'Present')
(7648.0, '2024-12-08T09:10:28+00:00', 'Present', 5, 4, 'Present')
(7648.0, '2024-12-08T09:14:37+00:00', 'Present', 6, 3, 'Present')
(7648.0, '2024-12-08T09:37:57+00:00', 'Present', 7, 2, 'Present')
(7648.0, '2024-12-08T10:12:01+00:00', 'Present', 8, 1, 'Present')
(7649.0, '2024-12-08T04:07:52+00:00', 'Unoccupied', 1, 23, None)
(7649.0, '2024-12-08T05:08:04+00:00', 'Unoccupied', 2, 22, 'Unoccupied')
(7649.0, '2024-12-08T05:52:38+00:00', 'Unoccupied', 3, 21, 'Unoccupied')
(7649.0, '2024-12-08T06:31:48+00:00', 'Unoccupied', 4, 20, 'Unoccupied')
(7649.0, '2024-12-08T06:49:26+00:00', 'Unoccupied', 5, 19, 'Unoccupied')
(7649.0, '2024-12-08T07:10:52+00:00', 'Unoccupied', 6, 18, 'Unoccupied')
(7649.0, '2024-12-08T07:11:28+00:00', 'Unoccupied', 7, 17, 'Unoccupied')
(7649.0, '2024-12-08T07:20:32+00:00', 'Unoccupied', 8, 16, 'Unoccupied')
(7649.0, '2024-12-08T07:23:06+00:00', 'Present', 9, 15, 'Unoccupied')
(7649.0, '2024-12-08T07:40:35+00:00', 'Present', 10, 14, 'Present')
(7649.0, '2024-12-08T08:11:24+00:00', 'Present', 11, 13, 'Present')
(7649.0, '2024-12-08T08:12:39+00:00', 'Present', 12, 12, 'Present')
(7649.0, '2024-12-08T08:38:47+00:00', 'Unoccupied', 13, 11, 'Present')
(7649.0, '2024-12-08T08:46:29+00:00', 'Unoccupied', 14, 10, 'Unoccupied')
(7649.0, '2024-12-08T08:47:16+00:00', 'Unoccupied', 15, 9, 'Unoccupied')
(7649.0, '2024-12-08T08:50:07+00:00', 'Unoccupied', 16, 8, 'Unoccupied')
(7649.0, '2024-12-08T09:04:49+00:00', 'Present', 17, 7, 'Unoccupied')
(7649.0, '2024-12-08T09:19:46+00:00', 'Unoccupied', 18, 6, 'Present')
(7649.0, '2024-12-08T09:36:01+00:00', 'Unoccupied', 19, 5, 'Unoccupied')
(7649.0, '2024-12-08T09:44:20+00:00', 'Unoccupied', 20, 4, 'Unoccupied')
(7649.0, '2024-12-08T09:51:07+00:00', 'Unoccupied', 21, 3, 'Unoccupied')
(7649.0, '2024-12-08T10:08:27+00:00', 'Unoccupied', 22, 2, 'Unoccupied')
(7649.0, '2024-12-08T10:11:23+00:00', 'Unoccupied', 23, 1, 'Unoccupied')
(7659.0, '2024-12-08T09:13:19+00:00', 'Unoccupied', 1, 4, None)
(7659.0, '2024-12-08T09:54:43+00:00', 'Unoccupied', 2, 3, 'Unoccupied')
(7659.0, '2024-12-08T09:58:33+00:00', 'Unoccupied', 3, 2, 'Unoccupied')
(7659.0, '2024-12-08T10:28:38+00:00', 'Unoccupied', 4, 1, 'Unoccupied')
(7660.0, '2024-12-08T10:03:09+00:00', 'Unoccupied', 1, 2, None)
(7660.0, '2024-12-08T10:13:46+00:00', 'Unoccupied', 2, 1, 'Unoccupied')
(7672.0, '2024-12-08T06:27:31+00:00', 'Present', 1, 3, None)
(7672.0, '2024-12-08T08:07:48+00:00', 'Unoccupied', 2, 2, 'Present')
(7672.0, '2024-12-08T09:15:52+00:00', 'Unoccupied', 3, 1, 'Unoccupied')
(7674.0, '2024-12-07T06:00:33+00:00', 'Unoccupied', 1, 21, None)
(7674.0, '2024-12-08T02:34:57+00:00', 'Present', 2, 20, 'Unoccupied')
(7674.0, '2024-12-08T03:18:19+00:00', 'Present', 3, 19, 'Present')
(7674.0, '2024-12-08T05:41:48+00:00', 'Present', 4, 18, 'Present')
(7674.0, '2024-12-08T08:15:21+00:00', 'Present', 5, 17, 'Present')
(7674.0, '2024-12-08T08:20:36+00:00', 'Present', 6, 16, 'Present')
(7674.0, '2024-12-08T08:47:02+00:00', 'Present', 7, 15, 'Present')
(7674.0, '2024-12-08T08:55:30+00:00', 'Present', 8, 14, 'Present')
(7674.0, '2024-12-08T09:00:42+00:00', 'Present', 9, 13, 'Present')
(7674.0, '2024-12-08T09:03:05+00:00', 'Present', 10, 12, 'Present')
(7674.0, '2024-12-08T09:17:29+00:00', 'Present', 11, 11, 'Present')
(7674.0, '2024-12-08T09:22:32+00:00', 'Present', 12, 10, 'Present')
(7674.0, '2024-12-08T09:34:19+00:00', 'Unoccupied', 13, 9, 'Present')
(7674.0, '2024-12-08T09:46:01+00:00', 'Present', 14, 8, 'Unoccupied')
(7674.0, '2024-12-08T09:57:30+00:00', 'Present', 15, 7, 'Present')
(7674.0, '2024-12-08T09:57:33+00:00', 'Present', 16, 6, 'Present')
(7674.0, '2024-12-08T10:03:11+00:00', 'Present', 17, 5, 'Present')
(7674.0, '2024-12-08T10:21:09+00:00', 'Present', 18, 4, 'Present')
(7674.0, '2024-12-08T10:23:02+00:00', 'Present', 19, 3, 'Present')
(7674.0, '2024-12-08T10:28:46+00:00', 'Present', 20, 2, 'Present')
(7674.0, '2024-12-08T10:29:49+00:00', 'Unoccupied', 21, 1, 'Present')
(7676.0, '2024-12-08T10:30:15+00:00', 'Unoccupied', 1, 2, None)
(7676.0, '2024-12-08T10:31:32+00:00', 'Unoccupied', 2, 1, 'Unoccupied')
(7686.0, '2024-12-08T06:22:45+00:00', 'Present', 1, 4, None)
(7686.0, '2024-12-08T10:16:00+00:00', 'Unoccupied', 2, 3, 'Present')
(7686.0, '2024-12-08T10:28:54+00:00', 'Unoccupied', 3, 2, 'Unoccupied')
(7686.0, '2024-12-08T10:29:48+00:00', 'Present', 4, 1, 'Unoccupied')
(7689.0, '2024-12-08T09:11:43+00:00', 'Present', 1, 4, None)
(7689.0, '2024-12-08T09:43:06+00:00', 'Unoccupied', 2, 3, 'Present')
(7689.0, '2024-12-08T10:04:10+00:00', 'Unoccupied', 3, 2, 'Unoccupied')
(7689.0, '2024-12-08T10:31:01+00:00', 'Present', 4, 1, 'Unoccupied')
(7690.0, '2024-12-08T09:43:12+00:00', 'Present', 1, 3, None)
(7690.0, '2024-12-08T09:51:04+00:00', 'Unoccupied', 2, 2, 'Present')
(7690.0, '2024-12-08T10:04:10+00:00', 'Unoccupied', 3, 1, 'Unoccupied')
(7692.0, '2024-03-13T03:03:31+00:00', 'Present', 1, 2, None)
(7692.0, '2024-03-13T03:37:00+00:00', 'Present', 2, 1, 'Present')
(7695.0, '2024-03-13T01:10:25+00:00', 'Present', 1, 3, None)
(7695.0, '2024-03-13T02:45:44+00:00', 'Present', 2, 2, 'Present')
(7695.0, '2024-03-13T03:38:29+00:00', 'Unoccupied', 3, 1, 'Present')
(7696.0, '2024-12-08T08:08:46+00:00', 'Present', 1, 3, None)
(7696.0, '2024-12-08T09:23:46+00:00', 'Present', 2, 2, 'Present')
(7696.0, '2024-12-08T10:23:24+00:00', 'Present', 3, 1, 'Present')
(7697.0, '2024-07-09T00:33:17+00:00', 'Unoccupied', 1, 5, None)
(7697.0, '2024-12-08T07:35:42+00:00', 'Present', 2, 4, 'Unoccupied')
(7697.0, '2024-12-08T08:45:36+00:00', 'Present', 3, 3, 'Present')
(7697.0, '2024-12-08T08:59:55+00:00', 'Present', 4, 2, 'Present')
(7697.0, '2024-12-08T09:32:49+00:00', 'Present', 5, 1, 'Present')
(7705.0, '2024-12-08T08:17:24+00:00', 'Present', 1, 7, None)
(7705.0, '2024-12-08T09:02:43+00:00', 'Present', 2, 6, 'Present')
(7705.0, '2024-12-08T09:22:47+00:00', 'Unoccupied', 3, 5, 'Present')
(7705.0, '2024-12-08T10:11:14+00:00', 'Present', 4, 4, 'Unoccupied')
(7705.0, '2024-12-08T10:21:51+00:00', 'Present', 5, 3, 'Present')
(7705.0, '2024-12-08T10:31:32+00:00', 'Present', 6, 2, 'Present')
(7705.0, '2024-12-08T10:31:43+00:00', 'Unoccupied', 7, 1, 'Present')
(7706.0, '2024-12-08T10:18:14+00:00', 'Present', 1, 1, None)
(7708.0, '2024-06-21T02:39:37+00:00', 'Unoccupied', 1, 21, None)
(7708.0, '2024-12-03T20:04:18+00:00', 'Unoccupied', 2, 20, 'Unoccupied')
(7708.0, '2024-12-03T20:14:39+00:00', 'Unoccupied', 3, 19, 'Unoccupied')
(7708.0, '2024-12-04T02:20:08+00:00', 'Present', 4, 18, 'Unoccupied')
(7708.0, '2024-12-07T06:32:48+00:00', 'Unoccupied', 5, 17, 'Present')
(7708.0, '2024-12-07T08:32:22+00:00', 'Unoccupied', 6, 16, 'Unoccupied')
(7708.0, '2024-12-07T10:30:19+00:00', 'Unoccupied', 7, 15, 'Unoccupied')
(7708.0, '2024-12-07T21:43:18+00:00', 'Unoccupied', 8, 14, 'Unoccupied')
(7708.0, '2024-12-08T03:36:28+00:00', 'Present', 9, 13, 'Unoccupied')
(7708.0, '2024-12-08T04:43:51+00:00', 'Unoccupied', 10, 12, 'Present')
(7708.0, '2024-12-08T06:06:00+00:00', 'Present', 11, 11, 'Unoccupied')
(7708.0, '2024-12-08T08:10:25+00:00', 'Unoccupied', 12, 10, 'Present')
(7708.0, '2024-12-08T08:13:50+00:00', 'Unoccupied', 13, 9, 'Unoccupied')
(7708.0, '2024-12-08T08:15:24+00:00', 'Present', 14, 8, 'Unoccupied')
(7708.0, '2024-12-08T09:01:01+00:00', 'Unoccupied', 15, 7, 'Present')
(7708.0, '2024-12-08T09:37:33+00:00', 'Present', 16, 6, 'Unoccupied')
(7708.0, '2024-12-08T09:38:16+00:00', 'Unoccupied', 17, 5, 'Present')
(7708.0, '2024-12-08T09:42:53+00:00', 'Unoccupied', 18, 4, 'Unoccupied')
(7708.0, '2024-12-08T09:46:08+00:00', 'Unoccupied', 19, 3, 'Unoccupied')
(7708.0, '2024-12-08T09:46:47+00:00', 'Unoccupied', 20, 2, 'Unoccupied')
(7708.0, '2024-12-08T10:22:26+00:00', 'Unoccupied', 21, 1, 'Unoccupied')
(7712.0, '2024-12-02T07:13:44+00:00', 'Present', 1, 19, None)
(7712.0, '2024-12-08T00:37:59+00:00', 'Present', 2, 18, 'Present')
(7712.0, '2024-12-08T02:53:36+00:00', 'Present', 3, 17, 'Present')
(7712.0, '2024-12-08T04:24:30+00:00', 'Present', 4, 16, 'Present')
(7712.0, '2024-12-08T07:25:09+00:00', 'Unoccupied', 5, 15, 'Present')
(7712.0, '2024-12-08T07:26:58+00:00', 'Present', 6, 14, 'Unoccupied')
(7712.0, '2024-12-08T08:14:43+00:00', 'Unoccupied', 7, 13, 'Present')
(7712.0, '2024-12-08T08:25:35+00:00', 'Unoccupied', 8, 12, 'Unoccupied')
(7712.0, '2024-12-08T08:25:55+00:00', 'Unoccupied', 9, 11, 'Unoccupied')
(7712.0, '2024-12-08T08:37:34+00:00', 'Unoccupied', 10, 10, 'Unoccupied')
(7712.0, '2024-12-08T08:43:40+00:00', 'Unoccupied', 11, 9, 'Unoccupied')
(7712.0, '2024-12-08T08:45:53+00:00', 'Unoccupied', 12, 8, 'Unoccupied')
(7712.0, '2024-12-08T08:59:01+00:00', 'Unoccupied', 13, 7, 'Unoccupied')
(7712.0, '2024-12-08T08:59:49+00:00', 'Unoccupied', 14, 6, 'Unoccupied')
(7712.0, '2024-12-08T09:41:47+00:00', 'Unoccupied', 15, 5, 'Unoccupied')
(7712.0, '2024-12-08T09:47:05+00:00', 'Unoccupied', 16, 4, 'Unoccupied')
(7712.0, '2024-12-08T09:56:52+00:00', 'Unoccupied', 17, 3, 'Unoccupied')
(7712.0, '2024-12-08T10:11:24+00:00', 'Unoccupied', 18, 2, 'Unoccupied')
(7712.0, '2024-12-08T10:25:50+00:00', 'Present', 19, 1, 'Unoccupied')
(7716.0, '2023-08-05T02:00:57+00:00', 'Present', 1, 26, None)
(7716.0, '2024-12-08T04:47:19+00:00', 'Present', 2, 25, 'Present')
(7716.0, '2024-12-08T05:05:07+00:00', 'Present', 3, 24, 'Present')
(7716.0, '2024-12-08T05:24:58+00:00', 'Present', 4, 23, 'Present')
(7716.0, '2024-12-08T07:01:07+00:00', 'Present', 5, 22, 'Present')
(7716.0, '2024-12-08T07:52:03+00:00', 'Present', 6, 21, 'Present')
(7716.0, '2024-12-08T08:10:29+00:00', 'Present', 7, 20, 'Present')
(7716.0, '2024-12-08T08:16:03+00:00', 'Present', 8, 19, 'Present')
(7716.0, '2024-12-08T09:03:01+00:00', 'Present', 9, 18, 'Present')
(7716.0, '2024-12-08T09:05:56+00:00', 'Present', 10, 17, 'Present')
(7716.0, '2024-12-08T09:42:01+00:00', 'Unoccupied', 11, 16, 'Present')
(7716.0, '2024-12-08T09:42:05+00:00', 'Unoccupied', 12, 15, 'Unoccupied')
(7716.0, '2024-12-08T09:53:58+00:00', 'Unoccupied', 13, 14, 'Unoccupied')
(7716.0, '2024-12-08T10:06:24+00:00', 'Unoccupied', 14, 13, 'Unoccupied')
(7716.0, '2024-12-08T10:07:03+00:00', 'Unoccupied', 15, 12, 'Unoccupied')
(7716.0, '2024-12-08T10:08:06+00:00', 'Unoccupied', 16, 11, 'Unoccupied')
(7716.0, '2024-12-08T10:09:12+00:00', 'Unoccupied', 17, 10, 'Unoccupied')
(7716.0, '2024-12-08T10:11:24+00:00', 'Present', 18, 9, 'Unoccupied')
(7716.0, '2024-12-08T10:14:05+00:00', 'Unoccupied', 19, 8, 'Present')
(7716.0, '2024-12-08T10:15:24+00:00', 'Unoccupied', 20, 7, 'Unoccupied')
(7716.0, '2024-12-08T10:26:58+00:00', 'Unoccupied', 21, 6, 'Unoccupied')
(7716.0, '2024-12-08T10:27:30+00:00', 'Unoccupied', 22, 5, 'Unoccupied')
(7716.0, '2024-12-08T10:29:23+00:00', 'Unoccupied', 23, 4, 'Unoccupied')
(7716.0, '2024-12-08T10:30:56+00:00', 'Unoccupied', 24, 3, 'Unoccupied')
(7716.0, '2024-12-08T10:31:11+00:00', 'Unoccupied', 25, 2, 'Unoccupied')
(7716.0, '2024-12-08T10:31:48+00:00', 'Unoccupied', 26, 1, 'Unoccupied')
(7718.0, '2024-04-09T06:27:45+00:00', 'Unoccupied', 1, 2, None)
(7718.0, '2024-12-08T10:22:18+00:00', 'Unoccupied', 2, 1, 'Unoccupied')
(7719.0, '2024-12-08T06:49:49+00:00', 'Unoccupied', 1, 2, None)
(7719.0, '2024-12-08T08:46:09+00:00', 'Unoccupied', 2, 1, 'Unoccupied')
(7720.0, '2024-12-07T01:48:14+00:00', 'Present', 1, 16, None)
(7720.0, '2024-12-07T01:50:17+00:00', 'Present', 2, 15, 'Present')
(7720.0, '2024-12-08T01:38:34+00:00', 'Present', 3, 14, 'Present')
(7720.0, '2024-12-08T03:52:41+00:00', 'Present', 4, 13, 'Present')
(7720.0, '2024-12-08T04:54:27+00:00', 'Present', 5, 12, 'Present')
(7720.0, '2024-12-08T05:38:54+00:00', 'Unoccupied', 6, 11, 'Present')
(7720.0, '2024-12-08T06:34:31+00:00', 'Unoccupied', 7, 10, 'Unoccupied')
(7720.0, '2024-12-08T06:36:31+00:00', 'Present', 8, 9, 'Unoccupied')
(7720.0, '2024-12-08T06:37:42+00:00', 'Unoccupied', 9, 8, 'Present')
(7720.0, '2024-12-08T06:57:24+00:00', 'Unoccupied', 10, 7, 'Unoccupied')
(7720.0, '2024-12-08T07:00:26+00:00', 'Present', 11, 6, 'Unoccupied')
(7720.0, '2024-12-08T07:26:44+00:00', 'Present', 12, 5, 'Present')
(7720.0, '2024-12-08T07:58:41+00:00', 'Unoccupied', 13, 4, 'Present')
(7720.0, '2024-12-08T08:23:05+00:00', 'Unoccupied', 14, 3, 'Unoccupied')
(7720.0, '2024-12-08T10:28:17+00:00', 'Unoccupied', 15, 2, 'Unoccupied')
(7720.0, '2024-12-08T10:30:10+00:00', 'Unoccupied', 16, 1, 'Unoccupied')
(7721.0, '2023-10-08T10:51:16+00:00', 'Unoccupied', 1, 45, None)
(7721.0, '2023-12-12T14:45:19+00:00', 'Unoccupied', 2, 44, 'Unoccupied')
(7721.0, '2024-07-06T05:02:31+00:00', 'Unoccupied', 3, 43, 'Unoccupied')
(7721.0, '2024-11-28T03:36:30+00:00', 'Present', 4, 42, 'Unoccupied')
(7721.0, '2024-12-04T15:34:53+00:00', 'Present', 5, 41, 'Present')
(7721.0, '2024-12-05T22:50:08+00:00', 'Present', 6, 40, 'Present')
(7721.0, '2024-12-06T06:17:13+00:00', 'Present', 7, 39, 'Present')
(7721.0, '2024-12-07T03:24:05+00:00', 'Present', 8, 38, 'Present')
(7721.0, '2024-12-07T08:58:48+00:00', 'Present', 9, 37, 'Present')
(7721.0, '2024-12-07T09:19:07+00:00', 'Present', 10, 36, 'Present')
(7721.0, '2024-12-07T22:09:17+00:00', 'Present', 11, 35, 'Present')
(7721.0, '2024-12-07T22:34:05+00:00', 'Present', 12, 34, 'Present')
(7721.0, '2024-12-08T00:10:52+00:00', 'Present', 13, 33, 'Present')
(7721.0, '2024-12-08T02:41:30+00:00', 'Present', 14, 32, 'Present')
(7721.0, '2024-12-08T03:11:39+00:00', 'Present', 15, 31, 'Present')
(7721.0, '2024-12-08T05:58:12+00:00', 'Unoccupied', 16, 30, 'Present')
(7721.0, '2024-12-08T06:21:55+00:00', 'Present', 17, 29, 'Unoccupied')
(7721.0, '2024-12-08T06:43:07+00:00', 'Present', 18, 28, 'Present')
(7721.0, '2024-12-08T08:27:19+00:00', 'Present', 19, 27, 'Present')
(7721.0, '2024-12-08T08:27:51+00:00', 'Present', 20, 26, 'Present')
(7721.0, '2024-12-08T08:34:07+00:00', 'Unoccupied', 21, 25, 'Present')
(7721.0, '2024-12-08T08:34:55+00:00', 'Unoccupied', 22, 24, 'Unoccupied')
(7721.0, '2024-12-08T08:47:32+00:00', 'Present', 23, 23, 'Unoccupied')
(7721.0, '2024-12-08T08:53:39+00:00', 'Present', 24, 22, 'Present')
(7721.0, '2024-12-08T08:53:56+00:00', 'Present', 25, 21, 'Present')
(7721.0, '2024-12-08T09:19:54+00:00', 'Unoccupied', 26, 20, 'Present')
(7721.0, '2024-12-08T09:26:27+00:00', 'Unoccupied', 27, 19, 'Unoccupied')
(7721.0, '2024-12-08T09:29:44+00:00', 'Unoccupied', 28, 18, 'Unoccupied')
(7721.0, '2024-12-08T09:30:12+00:00', 'Present', 29, 17, 'Unoccupied')
(7721.0, '2024-12-08T09:44:05+00:00', 'Present', 30, 16, 'Present')
(7721.0, '2024-12-08T09:50:28+00:00', 'Unoccupied', 31, 15, 'Present')
(7721.0, '2024-12-08T09:51:54+00:00', 'Unoccupied', 32, 14, 'Unoccupied')
(7721.0, '2024-12-08T09:55:07+00:00', 'Unoccupied', 33, 13, 'Unoccupied')
(7721.0, '2024-12-08T10:04:02+00:00', 'Unoccupied', 34, 12, 'Unoccupied')
(7721.0, '2024-12-08T10:06:46+00:00', 'Unoccupied', 35, 11, 'Unoccupied')
(7721.0, '2024-12-08T10:08:35+00:00', 'Unoccupied', 36, 10, 'Unoccupied')
(7721.0, '2024-12-08T10:18:48+00:00', 'Unoccupied', 37, 9, 'Unoccupied')
(7721.0, '2024-12-08T10:22:44+00:00', 'Unoccupied', 38, 8, 'Unoccupied')
(7721.0, '2024-12-08T10:23:11+00:00', 'Unoccupied', 39, 7, 'Unoccupied')
(7721.0, '2024-12-08T10:24:37+00:00', 'Unoccupied', 40, 6, 'Unoccupied')
(7721.0, '2024-12-08T10:26:59+00:00', 'Unoccupied', 41, 5, 'Unoccupied')
(7721.0, '2024-12-08T10:28:23+00:00', 'Unoccupied', 42, 4, 'Unoccupied')
(7721.0, '2024-12-08T10:29:36+00:00', 'Unoccupied', 43, 3, 'Unoccupied')
(7721.0, '2024-12-08T10:29:46+00:00', 'Unoccupied', 44, 2, 'Unoccupied')
(7721.0, '2024-12-08T10:30:39+00:00', 'Unoccupied', 45, 1, 'Unoccupied')
(7722.0, '2024-12-08T03:17:02+00:00', 'Unoccupied', 1, 5, None)
(7722.0, '2024-12-08T08:24:14+00:00', 'Unoccupied', 2, 4, 'Unoccupied')
(7722.0, '2024-12-08T09:24:31+00:00', 'Unoccupied', 3, 3, 'Unoccupied')
(7722.0, '2024-12-08T09:28:58+00:00', 'Unoccupied', 4, 2, 'Unoccupied')
(7722.0, '2024-12-08T10:07:32+00:00', 'Unoccupied', 5, 1, 'Unoccupied')
(7725.0, '2022-11-20T03:44:07+00:00', 'Unoccupied', 1, 27, None)
(7725.0, '2023-02-25T03:44:51+00:00', 'Unoccupied', 2, 26, 'Unoccupied')
(7725.0, '2024-04-20T19:15:00+00:00', 'Unoccupied', 3, 25, 'Unoccupied')
(7725.0, '2024-12-08T08:14:33+00:00', 'Present', 4, 24, 'Unoccupied')
(7725.0, '2024-12-08T08:20:05+00:00', 'Unoccupied', 5, 23, 'Present')
(7725.0, '2024-12-08T08:36:32+00:00', 'Present', 6, 22, 'Unoccupied')
(7725.0, '2024-12-08T08:53:03+00:00', 'Present', 7, 21, 'Present')
(7725.0, '2024-12-08T09:09:46+00:00', 'Unoccupied', 8, 20, 'Present')
(7725.0, '2024-12-08T09:14:19+00:00', 'Unoccupied', 9, 19, 'Unoccupied')
(7725.0, '2024-12-08T09:24:13+00:00', 'Unoccupied', 10, 18, 'Unoccupied')
(7725.0, '2024-12-08T09:35:08+00:00', 'Unoccupied', 11, 17, 'Unoccupied')
(7725.0, '2024-12-08T09:43:09+00:00', 'Unoccupied', 12, 16, 'Unoccupied')
(7725.0, '2024-12-08T09:49:59+00:00', 'Present', 13, 15, 'Unoccupied')
(7725.0, '2024-12-08T09:55:09+00:00', 'Present', 14, 14, 'Present')
(7725.0, '2024-12-08T09:56:53+00:00', 'Present', 15, 13, 'Present')
(7725.0, '2024-12-08T09:57:07+00:00', 'Unoccupied', 16, 12, 'Present')
(7725.0, '2024-12-08T09:58:48+00:00', 'Unoccupied', 17, 11, 'Unoccupied')
(7725.0, '2024-12-08T10:11:25+00:00', 'Unoccupied', 18, 10, 'Unoccupied')
(7725.0, '2024-12-08T10:20:12+00:00', 'Unoccupied', 19, 9, 'Unoccupied')
(7725.0, '2024-12-08T10:20:25+00:00', 'Present', 20, 8, 'Unoccupied')
(7725.0, '2024-12-08T10:21:41+00:00', 'Unoccupied', 21, 7, 'Present')
(7725.0, '2024-12-08T10:23:15+00:00', 'Present', 22, 6, 'Unoccupied')
(7725.0, '2024-12-08T10:26:39+00:00', 'Unoccupied', 23, 5, 'Present')
(7725.0, '2024-12-08T10:26:48+00:00', 'Present', 24, 4, 'Unoccupied')
(7725.0, '2024-12-08T10:29:33+00:00', 'Present', 25, 3, 'Present')
(7725.0, '2024-12-08T10:30:32+00:00', 'Unoccupied', 26, 2, 'Present')
(7725.0, '2024-12-08T10:30:59+00:00', 'Unoccupied', 27, 1, 'Unoccupied')
(7726.0, '2024-05-21T12:28:11+00:00', 'Present', 1, 5, None)
(7726.0, '2024-06-29T21:44:57+00:00', 'Present', 2, 4, 'Present')
(7726.0, '2024-12-07T21:58:28+00:00', 'Present', 3, 3, 'Present')
(7726.0, '2024-12-08T09:00:01+00:00', 'Present', 4, 2, 'Present')
(7726.0, '2024-12-08T10:18:46+00:00', 'Present', 5, 1, 'Present')
(7727.0, '2024-08-22T10:04:18+00:00', 'Unoccupied', 1, 6, None)
(7727.0, '2024-11-24T01:45:52+00:00', 'Unoccupied', 2, 5, 'Unoccupied')
(7727.0, '2024-12-07T05:52:09+00:00', 'Present', 3, 4, 'Unoccupied')
(7727.0, '2024-12-08T09:42:02+00:00', 'Present', 4, 3, 'Present')
(7727.0, '2024-12-08T10:04:36+00:00', 'Unoccupied', 5, 2, 'Present')
(7727.0, '2024-12-08T10:05:47+00:00', 'Present', 6, 1, 'Unoccupied')
(7728.0, '2024-12-08T04:03:31+00:00', 'Present', 1, 5, None)
(7728.0, '2024-12-08T09:19:04+00:00', 'Present', 2, 4, 'Present')
(7728.0, '2024-12-08T09:23:06+00:00', 'Unoccupied', 3, 3, 'Present')
(7728.0, '2024-12-08T09:41:55+00:00', 'Present', 4, 2, 'Unoccupied')
(7728.0, '2024-12-08T09:53:33+00:00', 'Present', 5, 1, 'Present')
(7733.0, '2024-12-08T00:17:39+00:00', 'Present', 1, 4, None)
(7733.0, '2024-12-08T02:37:50+00:00', 'Present', 2, 3, 'Present')
(7733.0, '2024-12-08T10:12:54+00:00', 'Unoccupied', 3, 2, 'Present')
(7733.0, '2024-12-08T10:23:59+00:00', 'Unoccupied', 4, 1, 'Unoccupied')
(7739.0, '2024-12-03T11:32:43+00:00', 'Present', 1, 21, None)
(7739.0, '2024-12-04T02:49:22+00:00', 'Present', 2, 20, 'Present')
(7739.0, '2024-12-06T05:25:40+00:00', 'Present', 3, 19, 'Present')
(7739.0, '2024-12-06T05:28:28+00:00', 'Present', 4, 18, 'Present')
(7739.0, '2024-12-07T04:35:36+00:00', 'Present', 5, 17, 'Present')
(7739.0, '2024-12-07T13:56:51+00:00', 'Present', 6, 16, 'Present')
(7739.0, '2024-12-08T00:54:22+00:00', 'Present', 7, 15, 'Present')
(7739.0, '2024-12-08T01:12:40+00:00', 'Present', 8, 14, 'Present')
(7739.0, '2024-12-08T03:36:42+00:00', 'Present', 9, 13, 'Present')
(7739.0, '2024-12-08T04:49:48+00:00', 'Unoccupied', 10, 12, 'Present')
(7739.0, '2024-12-08T05:05:49+00:00', 'Unoccupied', 11, 11, 'Unoccupied')
(7739.0, '2024-12-08T06:31:43+00:00', 'Present', 12, 10, 'Unoccupied')
(7739.0, '2024-12-08T06:48:19+00:00', 'Unoccupied', 13, 9, 'Present')
(7739.0, '2024-12-08T07:17:37+00:00', 'Unoccupied', 14, 8, 'Unoccupied')
(7739.0, '2024-12-08T07:19:52+00:00', 'Unoccupied', 15, 7, 'Unoccupied')
(7739.0, '2024-12-08T07:26:32+00:00', 'Present', 16, 6, 'Unoccupied')
(7739.0, '2024-12-08T08:38:27+00:00', 'Present', 17, 5, 'Present')
(7739.0, '2024-12-08T08:42:29+00:00', 'Present', 18, 4, 'Present')
(7739.0, '2024-12-08T08:47:21+00:00', 'Present', 19, 3, 'Present')
(7739.0, '2024-12-08T09:11:26+00:00', 'Present', 20, 2, 'Present')
(7739.0, '2024-12-08T10:16:18+00:00', 'Present', 21, 1, 'Present')
(7740.0, '2024-12-03T04:19:30+00:00', 'Present', 1, 5, None)
(7740.0, '2024-12-07T10:44:50+00:00', 'Present', 2, 4, 'Present')
(7740.0, '2024-12-08T05:56:20+00:00', 'Unoccupied', 3, 3, 'Present')
(7740.0, '2024-12-08T06:19:06+00:00', 'Unoccupied', 4, 2, 'Unoccupied')
(7740.0, '2024-12-08T07:46:48+00:00', 'Unoccupied', 5, 1, 'Unoccupied')
(7748.0, '2024-12-08T02:18:51+00:00', 'Present', 1, 16, None)
(7748.0, '2024-12-08T03:05:39+00:00', 'Present', 2, 15, 'Present')
(7748.0, '2024-12-08T05:13:08+00:00', 'Present', 3, 14, 'Present')
(7748.0, '2024-12-08T06:51:57+00:00', 'Present', 4, 13, 'Present')
(7748.0, '2024-12-08T07:11:54+00:00', 'Unoccupied', 5, 12, 'Present')
(7748.0, '2024-12-08T08:21:17+00:00', 'Unoccupied', 6, 11, 'Unoccupied')
(7748.0, '2024-12-08T08:42:02+00:00', 'Unoccupied', 7, 10, 'Unoccupied')
(7748.0, '2024-12-08T08:48:16+00:00', 'Unoccupied', 8, 9, 'Unoccupied')
(7748.0, '2024-12-08T08:48:41+00:00', 'Unoccupied', 9, 8, 'Unoccupied')
(7748.0, '2024-12-08T09:12:00+00:00', 'Unoccupied', 10, 7, 'Unoccupied')
(7748.0, '2024-12-08T09:19:36+00:00', 'Unoccupied', 11, 6, 'Unoccupied')
(7748.0, '2024-12-08T09:21:05+00:00', 'Unoccupied', 12, 5, 'Unoccupied')
(7748.0, '2024-12-08T09:59:17+00:00', 'Unoccupied', 13, 4, 'Unoccupied')
(7748.0, '2024-12-08T09:59:43+00:00', 'Unoccupied', 14, 3, 'Unoccupied')
(7748.0, '2024-12-08T10:02:29+00:00', 'Unoccupied', 15, 2, 'Unoccupied')
(7748.0, '2024-12-08T10:19:10+00:00', 'Unoccupied', 16, 1, 'Unoccupied')
(7752.0, '2024-12-08T06:08:20+00:00', 'Unoccupied', 1, 10, None)
(7752.0, '2024-12-08T06:26:53+00:00', 'Present', 2, 9, 'Unoccupied')
(7752.0, '2024-12-08T07:38:18+00:00', 'Unoccupied', 3, 8, 'Present')
(7752.0, '2024-12-08T07:57:35+00:00', 'Present', 4, 7, 'Unoccupied')
(7752.0, '2024-12-08T08:36:32+00:00', 'Unoccupied', 5, 6, 'Present')
(7752.0, '2024-12-08T09:38:53+00:00', 'Unoccupied', 6, 5, 'Unoccupied')
(7752.0, '2024-12-08T10:02:24+00:00', 'Unoccupied', 7, 4, 'Unoccupied')
(7752.0, '2024-12-08T10:03:43+00:00', 'Unoccupied', 8, 3, 'Unoccupied')
(7752.0, '2024-12-08T10:20:31+00:00', 'Unoccupied', 9, 2, 'Unoccupied')
(7752.0, '2024-12-08T10:25:55+00:00', 'Unoccupied', 10, 1, 'Unoccupied')
(7753.0, '2024-06-27T06:02:51+00:00', 'Unoccupied', 1, 28, None)
(7753.0, '2024-06-27T06:07:49+00:00', 'Unoccupied', 2, 27, 'Unoccupied')
(7753.0, '2024-06-27T06:17:12+00:00', 'Unoccupied', 3, 26, 'Unoccupied')
(7753.0, '2024-06-27T06:19:58+00:00', 'Unoccupied', 4, 25, 'Unoccupied')
(7753.0, '2024-06-27T06:25:16+00:00', 'Unoccupied', 5, 24, 'Unoccupied')
(7753.0, '2024-06-27T06:25:59+00:00', 'Unoccupied', 6, 23, 'Unoccupied')
(7753.0, '2024-06-27T06:28:55+00:00', 'Unoccupied', 7, 22, 'Unoccupied')
(7753.0, '2024-06-27T06:29:59+00:00', 'Unoccupied', 8, 21, 'Unoccupied')
(7753.0, '2024-06-27T06:34:00+00:00', 'Unoccupied', 9, 20, 'Unoccupied')
(7753.0, '2024-06-27T06:44:34+00:00', 'Unoccupied', 10, 19, 'Unoccupied')
(7753.0, '2024-06-27T07:00:57+00:00', 'Unoccupied', 11, 18, 'Unoccupied')
(7753.0, '2024-06-27T07:03:58+00:00', 'Unoccupied', 12, 17, 'Unoccupied')
(7753.0, '2024-06-27T07:08:24+00:00', 'Unoccupied', 13, 16, 'Unoccupied')
(7753.0, '2024-06-27T07:52:31+00:00', 'Unoccupied', 14, 15, 'Unoccupied')
(7753.0, '2024-06-27T07:54:41+00:00', 'Unoccupied', 15, 14, 'Unoccupied')
(7753.0, '2024-06-27T08:44:27+00:00', 'Unoccupied', 16, 13, 'Unoccupied')
(7753.0, '2024-07-12T08:00:53+00:00', 'Unoccupied', 17, 12, 'Unoccupied')
(7753.0, '2024-12-08T03:28:58+00:00', 'Present', 18, 11, 'Unoccupied')
(7753.0, '2024-12-08T04:03:09+00:00', 'Present', 19, 10, 'Present')
(7753.0, '2024-12-08T06:13:33+00:00', 'Present', 20, 9, 'Present')
(7753.0, '2024-12-08T06:13:55+00:00', 'Present', 21, 8, 'Present')
(7753.0, '2024-12-08T06:31:41+00:00', 'Present', 22, 7, 'Present')
(7753.0, '2024-12-08T06:35:41+00:00', 'Present', 23, 6, 'Present')
(7753.0, '2024-12-08T07:27:38+00:00', 'Unoccupied', 24, 5, 'Present')
(7753.0, '2024-12-08T07:57:01+00:00', 'Present', 25, 4, 'Unoccupied')
(7753.0, '2024-12-08T09:56:00+00:00', 'Present', 26, 3, 'Present')
(7753.0, '2024-12-08T10:09:21+00:00', 'Unoccupied', 27, 2, 'Present')
(7753.0, '2024-12-08T10:29:10+00:00', 'Present', 28, 1, 'Unoccupied')
(7757.0, '2024-12-06T09:11:03+00:00', 'Present', 1, 16, None)
(7757.0, '2024-12-08T02:01:39+00:00', 'Present', 2, 15, 'Present')
(7757.0, '2024-12-08T02:03:20+00:00', 'Present', 3, 14, 'Present')
(7757.0, '2024-12-08T06:25:09+00:00', 'Present', 4, 13, 'Present')
(7757.0, '2024-12-08T06:56:06+00:00', 'Present', 5, 12, 'Present')
(7757.0, '2024-12-08T07:53:35+00:00', 'Unoccupied', 6, 11, 'Present')
(7757.0, '2024-12-08T08:18:20+00:00', 'Present', 7, 10, 'Unoccupied')
(7757.0, '2024-12-08T08:35:36+00:00', 'Present', 8, 9, 'Present')
(7757.0, '2024-12-08T09:27:47+00:00', 'Present', 9, 8, 'Present')
(7757.0, '2024-12-08T09:48:33+00:00', 'Present', 10, 7, 'Present')
(7757.0, '2024-12-08T09:57:36+00:00', 'Present', 11, 6, 'Present')
(7757.0, '2024-12-08T09:58:02+00:00', 'Present', 12, 5, 'Present')
(7757.0, '2024-12-08T10:09:23+00:00', 'Present', 13, 4, 'Present')
(7757.0, '2024-12-08T10:25:57+00:00', 'Present', 14, 3, 'Present')
(7757.0, '2024-12-08T10:29:45+00:00', 'Present', 15, 2, 'Present')
(7757.0, '2024-12-08T10:30:03+00:00', 'Present', 16, 1, 'Present')
(7762.0, '2024-12-08T10:11:53+00:00', 'Unoccupied', 1, 3, None)
(7762.0, '2024-12-08T10:21:35+00:00', 'Unoccupied', 2, 2, 'Unoccupied')
(7762.0, '2024-12-08T10:25:56+00:00', 'Present', 3, 1, 'Unoccupied')
(7763.0, '2024-12-08T07:15:56+00:00', 'Present', 1, 6, None)
(7763.0, '2024-12-08T08:28:27+00:00', 'Present', 2, 5, 'Present')
(7763.0, '2024-12-08T09:17:53+00:00', 'Unoccupied', 3, 4, 'Present')
(7763.0, '2024-12-08T10:14:45+00:00', 'Unoccupied', 4, 3, 'Unoccupied')
(7763.0, '2024-12-08T10:14:53+00:00', 'Unoccupied', 5, 2, 'Unoccupied')
(7763.0, '2024-12-08T10:15:34+00:00', 'Present', 6, 1, 'Unoccupied')
(7764.0, '2024-12-08T09:27:19+00:00', 'Present', 1, 4, None)
(7764.0, '2024-12-08T09:58:52+00:00', 'Unoccupied', 2, 3, 'Present')
(7764.0, '2024-12-08T10:12:59+00:00', 'Unoccupied', 3, 2, 'Unoccupied')
(7764.0, '2024-12-08T10:14:45+00:00', 'Unoccupied', 4, 1, 'Unoccupied')
(7765.0, '2024-12-08T09:13:29+00:00', 'Present', 1, 2, None)
(7765.0, '2024-12-08T09:37:25+00:00', 'Present', 2, 1, 'Present')
(7766.0, '2022-12-30T12:40:42+00:00', 'Unoccupied', 1, 15, None)
(7766.0, '2024-12-08T02:46:36+00:00', 'Present', 2, 14, 'Unoccupied')
(7766.0, '2024-12-08T03:40:52+00:00', 'Present', 3, 13, 'Present')
(7766.0, '2024-12-08T04:51:22+00:00', 'Present', 4, 12, 'Present')
(7766.0, '2024-12-08T06:24:48+00:00', 'Present', 5, 11, 'Present')
(7766.0, '2024-12-08T06:44:10+00:00', 'Present', 6, 10, 'Present')
(7766.0, '2024-12-08T09:13:05+00:00', 'Present', 7, 9, 'Present')
(7766.0, '2024-12-08T09:22:37+00:00', 'Present', 8, 8, 'Present')
(7766.0, '2024-12-08T09:34:33+00:00', 'Present', 9, 7, 'Present')
(7766.0, '2024-12-08T09:46:38+00:00', 'Present', 10, 6, 'Present')
(7766.0, '2024-12-08T09:47:08+00:00', 'Present', 11, 5, 'Present')
(7766.0, '2024-12-08T09:49:38+00:00', 'Present', 12, 4, 'Present')
(7766.0, '2024-12-08T09:52:56+00:00', 'Present', 13, 3, 'Present')
(7766.0, '2024-12-08T09:55:17+00:00', 'Present', 14, 2, 'Present')
(7766.0, '2024-12-08T10:14:15+00:00', 'Present', 15, 1, 'Present')
(7767.0, '2024-10-15T06:56:08+00:00', 'Unoccupied', 1, 4, None)
(7767.0, '2024-10-15T19:16:34+00:00', 'Present', 2, 3, 'Unoccupied')
(7767.0, '2024-10-15T20:41:07+00:00', 'Present', 3, 2, 'Present')
(7767.0, '2024-10-15T21:35:53+00:00', 'Unoccupied', 4, 1, 'Present')
(7768.0, '2024-10-15T03:49:10+00:00', 'Unoccupied', 1, 10, None)
(7768.0, '2024-10-15T05:48:05+00:00', 'Unoccupied', 2, 9, 'Unoccupied')
(7768.0, '2024-10-15T18:48:52+00:00', 'Unoccupied', 3, 8, 'Unoccupied')
(7768.0, '2024-10-15T18:56:43+00:00', 'Present', 4, 7, 'Unoccupied')
(7768.0, '2024-10-15T19:40:22+00:00', 'Unoccupied', 5, 6, 'Present')
(7768.0, '2024-10-15T19:40:31+00:00', 'Unoccupied', 6, 5, 'Unoccupied')
(7768.0, '2024-10-15T19:40:41+00:00', 'Unoccupied', 7, 4, 'Unoccupied')
(7768.0, '2024-10-15T20:13:53+00:00', 'Unoccupied', 8, 3, 'Unoccupied')
(7768.0, '2024-10-15T20:32:08+00:00', 'Unoccupied', 9, 2, 'Unoccupied')
(7768.0, '2024-10-15T20:38:44+00:00', 'Unoccupied', 10, 1, 'Unoccupied')
(7769.0, '2024-12-08T08:57:07+00:00', 'Present', 1, 6, None)
(7769.0, '2024-12-08T09:28:14+00:00', 'Present', 2, 5, 'Present')
(7769.0, '2024-12-08T09:46:11+00:00', 'Present', 3, 4, 'Present')
(7769.0, '2024-12-08T10:27:02+00:00', 'Unoccupied', 4, 3, 'Present')
(7769.0, '2024-12-08T10:27:08+00:00', 'Present', 5, 2, 'Unoccupied')
(7769.0, '2024-12-08T10:30:30+00:00', 'Unoccupied', 6, 1, 'Present')
(7770.0, '2024-10-21T00:38:26+00:00', 'Present', 1, 7, None)
(7770.0, '2024-10-21T01:35:45+00:00', 'Present', 2, 6, 'Present')
(7770.0, '2024-10-21T01:38:25+00:00', 'Present', 3, 5, 'Present')
(7770.0, '2024-10-21T01:57:44+00:00', 'Unoccupied', 4, 4, 'Present')
(7770.0, '2024-10-21T02:05:00+00:00', 'Present', 5, 3, 'Unoccupied')
(7770.0, '2024-10-21T02:19:46+00:00', 'Unoccupied', 6, 2, 'Present')
(7770.0, '2024-10-21T02:22:49+00:00', 'Unoccupied', 7, 1, 'Unoccupied')
(7772.0, '2024-12-08T08:45:22+00:00', 'Unoccupied', 1, 3, None)
(7772.0, '2024-12-08T09:39:16+00:00', 'Present', 2, 2, 'Unoccupied')
(7772.0, '2024-12-08T10:10:11+00:00', 'Present', 3, 1, 'Present')
(7779.0, '2024-10-20T23:47:54+00:00', 'Present', 1, 3, None)
(7779.0, '2024-10-21T01:17:14+00:00', 'Present', 2, 2, 'Present')
(7779.0, '2024-10-21T01:55:58+00:00', 'Present', 3, 1, 'Present')
(7780.0, '2024-12-08T08:59:56+00:00', 'Present', 1, 3, None)
(7780.0, '2024-12-08T09:18:48+00:00', 'Present', 2, 2, 'Present')
(7780.0, '2024-12-08T10:21:40+00:00', 'Present', 3, 1, 'Present')
(7792.0, '2024-12-08T07:59:11+00:00', 'Present', 1, 2, None)
(7792.0, '2024-12-08T09:12:06+00:00', 'Present', 2, 1, 'Present')
(7800.0, '2023-08-21T00:09:03+00:00', 'Present', 1, 5, None)
(7800.0, '2024-03-22T09:43:24+00:00', 'Present', 2, 4, 'Present')
(7800.0, '2024-03-22T10:06:00+00:00', 'Present', 3, 3, 'Present')
(7800.0, '2024-03-31T00:44:47+00:00', 'Present', 4, 2, 'Present')
(7800.0, '2024-03-31T01:19:05+00:00', 'Present', 5, 1, 'Present')
(7910.0, '2024-12-08T07:49:23+00:00', 'Present', 1, 16, None)
(7910.0, '2024-12-08T08:09:32+00:00', 'Present', 2, 15, 'Present')
(7910.0, '2024-12-08T08:15:48+00:00', 'Unoccupied', 3, 14, 'Present')
(7910.0, '2024-12-08T08:45:26+00:00', 'Present', 4, 13, 'Unoccupied')
(7910.0, '2024-12-08T09:12:50+00:00', 'Present', 5, 12, 'Present')
(7910.0, '2024-12-08T09:15:40+00:00', 'Present', 6, 11, 'Present')
(7910.0, '2024-12-08T09:44:19+00:00', 'Present', 7, 10, 'Present')
(7910.0, '2024-12-08T09:48:46+00:00', 'Present', 8, 9, 'Present')
(7910.0, '2024-12-08T10:05:47+00:00', 'Present', 9, 8, 'Present')
(7910.0, '2024-12-08T10:13:03+00:00', 'Present', 10, 7, 'Present')
(7910.0, '2024-12-08T10:13:22+00:00', 'Unoccupied', 11, 6, 'Present')
(7910.0, '2024-12-08T10:16:45+00:00', 'Unoccupied', 12, 5, 'Unoccupied')
(7910.0, '2024-12-08T10:23:38+00:00', 'Present', 13, 4, 'Unoccupied')
(7910.0, '2024-12-08T10:26:00+00:00', 'Unoccupied', 14, 3, 'Present')
(7910.0, '2024-12-08T10:29:46+00:00', 'Unoccupied', 15, 2, 'Unoccupied')
(7910.0, '2024-12-08T10:30:47+00:00', 'Present', 16, 1, 'Unoccupied')
(7922.0, '2023-04-06T11:25:35+00:00', 'Unoccupied', 1, 10, None)
(7922.0, '2023-08-23T10:27:45+00:00', 'Present', 2, 9, 'Unoccupied')
(7922.0, '2024-12-07T11:05:49+00:00', 'Present', 3, 8, 'Present')
(7922.0, '2024-12-08T04:36:10+00:00', 'Unoccupied', 4, 7, 'Present')
(7922.0, '2024-12-08T05:05:05+00:00', 'Present', 5, 6, 'Unoccupied')
(7922.0, '2024-12-08T06:11:23+00:00', 'Present', 6, 5, 'Present')
(7922.0, '2024-12-08T06:52:46+00:00', 'Present', 7, 4, 'Present')
(7922.0, '2024-12-08T07:28:14+00:00', 'Present', 8, 3, 'Present')
(7922.0, '2024-12-08T09:09:04+00:00', 'Unoccupied', 9, 2, 'Present')
(7922.0, '2024-12-08T10:04:33+00:00', 'Unoccupied', 10, 1, 'Unoccupied')
(7923.0, '2023-11-14T02:53:26+00:00', 'Unoccupied', 1, 35, None)
(7923.0, '2024-12-07T08:02:51+00:00', 'Present', 2, 34, 'Unoccupied')
(7923.0, '2024-12-07T11:45:52+00:00', 'Present', 3, 33, 'Present')
(7923.0, '2024-12-08T03:21:31+00:00', 'Present', 4, 32, 'Present')
(7923.0, '2024-12-08T04:59:49+00:00', 'Present', 5, 31, 'Present')
(7923.0, '2024-12-08T07:15:04+00:00', 'Present', 6, 30, 'Present')
(7923.0, '2024-12-08T07:29:44+00:00', 'Present', 7, 29, 'Present')
(7923.0, '2024-12-08T07:41:27+00:00', 'Present', 8, 28, 'Present')
(7923.0, '2024-12-08T07:41:48+00:00', 'Present', 9, 27, 'Present')
(7923.0, '2024-12-08T07:48:23+00:00', 'Present', 10, 26, 'Present')
(7923.0, '2024-12-08T07:49:05+00:00', 'Present', 11, 25, 'Present')
(7923.0, '2024-12-08T07:55:14+00:00', 'Present', 12, 24, 'Present')
(7923.0, '2024-12-08T08:20:36+00:00', 'Unoccupied', 13, 23, 'Present')
(7923.0, '2024-12-08T08:55:06+00:00', 'Unoccupied', 14, 22, 'Unoccupied')
(7923.0, '2024-12-08T08:57:47+00:00', 'Present', 15, 21, 'Unoccupied')
(7923.0, '2024-12-08T09:18:59+00:00', 'Unoccupied', 16, 20, 'Present')
(7923.0, '2024-12-08T09:21:21+00:00', 'Present', 17, 19, 'Unoccupied')
(7923.0, '2024-12-08T09:22:52+00:00', 'Unoccupied', 18, 18, 'Present')
(7923.0, '2024-12-08T09:37:22+00:00', 'Unoccupied', 19, 17, 'Unoccupied')
(7923.0, '2024-12-08T09:37:27+00:00', 'Unoccupied', 20, 16, 'Unoccupied')
(7923.0, '2024-12-08T09:40:49+00:00', 'Present', 21, 15, 'Unoccupied')
(7923.0, '2024-12-08T09:45:49+00:00', 'Unoccupied', 22, 14, 'Present')
(7923.0, '2024-12-08T09:49:05+00:00', 'Unoccupied', 23, 13, 'Unoccupied')
(7923.0, '2024-12-08T10:00:29+00:00', 'Present', 24, 12, 'Unoccupied')
(7923.0, '2024-12-08T10:01:35+00:00', 'Unoccupied', 25, 11, 'Present')
(7923.0, '2024-12-08T10:03:21+00:00', 'Unoccupied', 26, 10, 'Unoccupied')
(7923.0, '2024-12-08T10:03:38+00:00', 'Unoccupied', 27, 9, 'Unoccupied')
(7923.0, '2024-12-08T10:07:03+00:00', 'Unoccupied', 28, 8, 'Unoccupied')
(7923.0, '2024-12-08T10:08:07+00:00', 'Unoccupied', 29, 7, 'Unoccupied')
(7923.0, '2024-12-08T10:08:52+00:00', 'Unoccupied', 30, 6, 'Unoccupied')
(7923.0, '2024-12-08T10:12:06+00:00', 'Unoccupied', 31, 5, 'Unoccupied')
(7923.0, '2024-12-08T10:19:29+00:00', 'Present', 32, 4, 'Unoccupied')
(7923.0, '2024-12-08T10:23:26+00:00', 'Present', 33, 3, 'Present')
(7923.0, '2024-12-08T10:29:21+00:00', 'Unoccupied', 34, 2, 'Present')
(7923.0, '2024-12-08T10:29:41+00:00', 'Present', 35, 1, 'Unoccupied')
(7924.0, '2023-03-16T22:53:23+00:00', 'Present', 1, 17, None)
(7924.0, '2023-05-27T16:40:41+00:00', 'Unoccupied', 2, 16, 'Present')
(7924.0, '2023-06-04T06:46:46+00:00', 'Unoccupied', 3, 15, 'Unoccupied')
(7924.0, '2023-06-05T07:35:13+00:00', 'Unoccupied', 4, 14, 'Unoccupied')
(7924.0, '2023-06-07T00:41:04+00:00', 'Unoccupied', 5, 13, 'Unoccupied')
(7924.0, '2023-06-07T01:06:40+00:00', 'Present', 6, 12, 'Unoccupied')
(7924.0, '2023-06-07T01:13:53+00:00', 'Unoccupied', 7, 11, 'Present')
(7924.0, '2023-06-07T02:25:28+00:00', 'Unoccupied', 8, 10, 'Unoccupied')
(7924.0, '2023-06-07T14:04:34+00:00', 'Unoccupied', 9, 9, 'Unoccupied')
(7924.0, '2023-06-07T20:32:23+00:00', 'Unoccupied', 10, 8, 'Unoccupied')
(7924.0, '2023-06-07T20:34:08+00:00', 'Unoccupied', 11, 7, 'Unoccupied')
(7924.0, '2023-06-07T21:56:09+00:00', 'Unoccupied', 12, 6, 'Unoccupied')
(7924.0, '2023-06-07T22:06:02+00:00', 'Unoccupied', 13, 5, 'Unoccupied')
(7924.0, '2023-06-07T22:47:44+00:00', 'Present', 14, 4, 'Unoccupied')
(7924.0, '2023-06-07T22:49:54+00:00', 'Unoccupied', 15, 3, 'Present')
(7924.0, '2023-06-07T23:25:51+00:00', 'Unoccupied', 16, 2, 'Unoccupied')
(7924.0, '2024-12-07T04:09:52+00:00', 'Present', 17, 1, 'Unoccupied')
(7930.0, '2024-12-07T22:31:56+00:00', 'Unoccupied', 1, 11, None)
(7930.0, '2024-12-07T23:19:15+00:00', 'Unoccupied', 2, 10, 'Unoccupied')
(7930.0, '2024-12-07T23:30:13+00:00', 'Unoccupied', 3, 9, 'Unoccupied')
(7930.0, '2024-12-08T03:00:11+00:00', 'Unoccupied', 4, 8, 'Unoccupied')
(7930.0, '2024-12-08T05:19:58+00:00', 'Present', 5, 7, 'Unoccupied')
(7930.0, '2024-12-08T08:42:01+00:00', 'Unoccupied', 6, 6, 'Present')
(7930.0, '2024-12-08T09:02:15+00:00', 'Unoccupied', 7, 5, 'Unoccupied')
(7930.0, '2024-12-08T09:02:17+00:00', 'Unoccupied', 8, 4, 'Unoccupied')
(7930.0, '2024-12-08T09:20:14+00:00', 'Unoccupied', 9, 3, 'Unoccupied')
(7930.0, '2024-12-08T09:33:39+00:00', 'Unoccupied', 10, 2, 'Unoccupied')
(7930.0, '2024-12-08T10:17:24+00:00', 'Unoccupied', 11, 1, 'Unoccupied')
(7936.0, '2024-12-07T01:50:24+00:00', 'Present', 1, 4, None)
(7936.0, '2024-12-08T04:00:42+00:00', 'Present', 2, 3, 'Present')
(7936.0, '2024-12-08T10:09:01+00:00', 'Unoccupied', 3, 2, 'Present')
(7936.0, '2024-12-08T10:18:46+00:00', 'Unoccupied', 4, 1, 'Unoccupied')
(7938.0, '2024-01-11T21:16:57+00:00', 'Unoccupied', 1, 7, None)
(7938.0, '2024-01-11T22:58:57+00:00', 'Present', 2, 6, 'Unoccupied')
(7938.0, '2024-03-27T07:38:24+00:00', 'Present', 3, 5, 'Present')
(7938.0, '2024-03-31T00:45:41+00:00', 'Unoccupied', 4, 4, 'Present')
(7938.0, '2024-04-09T04:55:35+00:00', 'Unoccupied', 5, 3, 'Unoccupied')
(7938.0, '2024-04-09T05:27:04+00:00', 'Unoccupied', 6, 2, 'Unoccupied')
(7938.0, '2024-04-09T06:26:11+00:00', 'Present', 7, 1, 'Unoccupied')
(7939.0, '2024-12-01T00:24:35+00:00', 'Unoccupied', 1, 12, None)
(7939.0, '2024-12-01T08:49:53+00:00', 'Unoccupied', 2, 11, 'Unoccupied')
(7939.0, '2024-12-01T09:44:49+00:00', 'Unoccupied', 3, 10, 'Unoccupied')
(7939.0, '2024-12-01T10:03:35+00:00', 'Unoccupied', 4, 9, 'Unoccupied')
(7939.0, '2024-12-07T07:23:30+00:00', 'Unoccupied', 5, 8, 'Unoccupied')
(7939.0, '2024-12-07T11:19:43+00:00', 'Unoccupied', 6, 7, 'Unoccupied')
(7939.0, '2024-12-07T22:40:16+00:00', 'Unoccupied', 7, 6, 'Unoccupied')
(7939.0, '2024-12-08T00:41:45+00:00', 'Unoccupied', 8, 5, 'Unoccupied')
(7939.0, '2024-12-08T03:32:51+00:00', 'Present', 9, 4, 'Unoccupied')
(7939.0, '2024-12-08T07:51:32+00:00', 'Unoccupied', 10, 3, 'Present')
(7939.0, '2024-12-08T08:20:08+00:00', 'Unoccupied', 11, 2, 'Unoccupied')
(7939.0, '2024-12-08T10:03:51+00:00', 'Unoccupied', 12, 1, 'Unoccupied')
(7948.0, '2024-12-08T09:36:35+00:00', 'Present', 1, 5, None)
(7948.0, '2024-12-08T09:45:23+00:00', 'Present', 2, 4, 'Present')
(7948.0, '2024-12-08T10:02:37+00:00', 'Present', 3, 3, 'Present')
(7948.0, '2024-12-08T10:12:24+00:00', 'Unoccupied', 4, 2, 'Present')
(7948.0, '2024-12-08T10:18:03+00:00', 'Unoccupied', 5, 1, 'Unoccupied')
(7949.0, '2024-08-15T22:33:13+00:00', 'Present', 1, 5, None)
(7949.0, '2024-12-08T09:01:14+00:00', 'Unoccupied', 2, 4, 'Present')
(7949.0, '2024-12-08T09:11:35+00:00', 'Unoccupied', 3, 3, 'Unoccupied')
(7949.0, '2024-12-08T09:38:10+00:00', 'Present', 4, 2, 'Unoccupied')
(7949.0, '2024-12-08T09:54:03+00:00', 'Unoccupied', 5, 1, 'Present')
(7951.0, '2024-01-11T23:02:07+00:00', 'Unoccupied', 1, 2, None)
(7951.0, '2024-03-31T01:27:04+00:00', 'Present', 2, 1, 'Unoccupied')
(7952.0, '2024-04-02T11:49:04+00:00', 'Unoccupied', 1, 3, None)
(7952.0, '2024-04-09T06:28:45+00:00', 'Present', 2, 2, 'Unoccupied')
(7952.0, '2024-04-09T06:28:58+00:00', 'Present', 3, 1, 'Present')
(7981.0, '2024-12-01T23:50:03+00:00', 'Present', 1, 30, None)
(7981.0, '2024-12-07T09:41:52+00:00', 'Unoccupied', 2, 29, 'Present')
(7981.0, '2024-12-07T12:02:15+00:00', 'Unoccupied', 3, 28, 'Unoccupied')
(7981.0, '2024-12-08T02:20:08+00:00', 'Unoccupied', 4, 27, 'Unoccupied')
(7981.0, '2024-12-08T02:49:45+00:00', 'Present', 5, 26, 'Unoccupied')
(7981.0, '2024-12-08T03:40:03+00:00', 'Unoccupied', 6, 25, 'Present')
(7981.0, '2024-12-08T04:07:30+00:00', 'Unoccupied', 7, 24, 'Unoccupied')
(7981.0, '2024-12-08T04:24:58+00:00', 'Unoccupied', 8, 23, 'Unoccupied')
(7981.0, '2024-12-08T05:27:20+00:00', 'Unoccupied', 9, 22, 'Unoccupied')
(7981.0, '2024-12-08T06:36:47+00:00', 'Unoccupied', 10, 21, 'Unoccupied')
(7981.0, '2024-12-08T06:53:08+00:00', 'Unoccupied', 11, 20, 'Unoccupied')
(7981.0, '2024-12-08T06:59:53+00:00', 'Present', 12, 19, 'Unoccupied')
(7981.0, '2024-12-08T07:33:35+00:00', 'Unoccupied', 13, 18, 'Present')
(7981.0, '2024-12-08T07:34:10+00:00', 'Unoccupied', 14, 17, 'Unoccupied')
(7981.0, '2024-12-08T07:40:01+00:00', 'Unoccupied', 15, 16, 'Unoccupied')
(7981.0, '2024-12-08T07:40:03+00:00', 'Unoccupied', 16, 15, 'Unoccupied')
(7981.0, '2024-12-08T08:05:31+00:00', 'Unoccupied', 17, 14, 'Unoccupied')
(7981.0, '2024-12-08T08:17:16+00:00', 'Unoccupied', 18, 13, 'Unoccupied')
(7981.0, '2024-12-08T08:36:29+00:00', 'Present', 19, 12, 'Unoccupied')
(7981.0, '2024-12-08T09:18:04+00:00', 'Unoccupied', 20, 11, 'Present')
(7981.0, '2024-12-08T09:37:23+00:00', 'Unoccupied', 21, 10, 'Unoccupied')
(7981.0, '2024-12-08T09:40:46+00:00', 'Unoccupied', 22, 9, 'Unoccupied')
(7981.0, '2024-12-08T09:41:21+00:00', 'Unoccupied', 23, 8, 'Unoccupied')
(7981.0, '2024-12-08T09:47:12+00:00', 'Present', 24, 7, 'Unoccupied')
(7981.0, '2024-12-08T09:59:31+00:00', 'Present', 25, 6, 'Present')
(7981.0, '2024-12-08T10:01:30+00:00', 'Present', 26, 5, 'Present')
(7981.0, '2024-12-08T10:07:30+00:00', 'Unoccupied', 27, 4, 'Present')
(7981.0, '2024-12-08T10:09:26+00:00', 'Unoccupied', 28, 3, 'Unoccupied')
(7981.0, '2024-12-08T10:11:56+00:00', 'Unoccupied', 29, 2, 'Unoccupied')
(7981.0, '2024-12-08T10:12:34+00:00', 'Unoccupied', 30, 1, 'Unoccupied')
(7985.0, '2023-01-15T17:01:33+00:00', 'Unoccupied', 1, 14, None)
(7985.0, '2023-01-24T22:20:20+00:00', 'Unoccupied', 2, 13, 'Unoccupied')
(7985.0, '2024-11-14T22:09:46+00:00', 'Unoccupied', 3, 12, 'Unoccupied')
(7985.0, '2024-12-08T04:07:04+00:00', 'Present', 4, 11, 'Unoccupied')
(7985.0, '2024-12-08T05:04:40+00:00', 'Unoccupied', 5, 10, 'Present')
(7985.0, '2024-12-08T05:40:52+00:00', 'Unoccupied', 6, 9, 'Unoccupied')
(7985.0, '2024-12-08T05:43:03+00:00', 'Unoccupied', 7, 8, 'Unoccupied')
(7985.0, '2024-12-08T05:45:53+00:00', 'Unoccupied', 8, 7, 'Unoccupied')
(7985.0, '2024-12-08T06:30:35+00:00', 'Unoccupied', 9, 6, 'Unoccupied')
(7985.0, '2024-12-08T06:34:49+00:00', 'Unoccupied', 10, 5, 'Unoccupied')
(7985.0, '2024-12-08T07:05:42+00:00', 'Unoccupied', 11, 4, 'Unoccupied')
(7985.0, '2024-12-08T07:54:54+00:00', 'Unoccupied', 12, 3, 'Unoccupied')
(7985.0, '2024-12-08T09:50:49+00:00', 'Unoccupied', 13, 2, 'Unoccupied')
(7985.0, '2024-12-08T10:18:36+00:00', 'Present', 14, 1, 'Unoccupied')
(7986.0, '2024-12-08T05:20:25+00:00', 'Present', 1, 5, None)
(7986.0, '2024-12-08T07:48:56+00:00', 'Present', 2, 4, 'Present')
(7986.0, '2024-12-08T08:20:21+00:00', 'Present', 3, 3, 'Present')
(7986.0, '2024-12-08T09:52:42+00:00', 'Present', 4, 2, 'Present')
(7986.0, '2024-12-08T10:04:34+00:00', 'Unoccupied', 5, 1, 'Present')
(7988.0, '2024-12-06T23:53:25+00:00', 'Present', 1, 9, None)
(7988.0, '2024-12-07T00:37:10+00:00', 'Present', 2, 8, 'Present')
(7988.0, '2024-12-08T03:41:06+00:00', 'Unoccupied', 3, 7, 'Present')
(7988.0, '2024-12-08T04:05:25+00:00', 'Unoccupied', 4, 6, 'Unoccupied')
(7988.0, '2024-12-08T05:06:53+00:00', 'Unoccupied', 5, 5, 'Unoccupied')
(7988.0, '2024-12-08T07:18:23+00:00', 'Unoccupied', 6, 4, 'Unoccupied')
(7988.0, '2024-12-08T07:32:37+00:00', 'Unoccupied', 7, 3, 'Unoccupied')
(7988.0, '2024-12-08T08:05:38+00:00', 'Present', 8, 2, 'Unoccupied')
(7988.0, '2024-12-08T08:06:19+00:00', 'Unoccupied', 9, 1, 'Present')
(7993.0, '2023-04-19T12:14:14+00:00', 'Unoccupied', 1, 20, None)
(7993.0, '2024-12-08T04:13:31+00:00', 'Present', 2, 19, 'Unoccupied')
(7993.0, '2024-12-08T04:30:41+00:00', 'Unoccupied', 3, 18, 'Present')
(7993.0, '2024-12-08T05:15:25+00:00', 'Unoccupied', 4, 17, 'Unoccupied')
(7993.0, '2024-12-08T05:28:10+00:00', 'Unoccupied', 5, 16, 'Unoccupied')
(7993.0, '2024-12-08T05:59:36+00:00', 'Unoccupied', 6, 15, 'Unoccupied')
(7993.0, '2024-12-08T05:59:51+00:00', 'Unoccupied', 7, 14, 'Unoccupied')
(7993.0, '2024-12-08T07:03:57+00:00', 'Unoccupied', 8, 13, 'Unoccupied')
(7993.0, '2024-12-08T07:14:17+00:00', 'Unoccupied', 9, 12, 'Unoccupied')
(7993.0, '2024-12-08T07:26:31+00:00', 'Present', 10, 11, 'Unoccupied')
(7993.0, '2024-12-08T07:32:40+00:00', 'Present', 11, 10, 'Present')
(7993.0, '2024-12-08T07:48:11+00:00', 'Present', 12, 9, 'Present')
(7993.0, '2024-12-08T08:07:20+00:00', 'Present', 13, 8, 'Present')
(7993.0, '2024-12-08T08:10:00+00:00', 'Unoccupied', 14, 7, 'Present')
(7993.0, '2024-12-08T08:50:47+00:00', 'Unoccupied', 15, 6, 'Unoccupied')
(7993.0, '2024-12-08T08:53:35+00:00', 'Unoccupied', 16, 5, 'Unoccupied')
(7993.0, '2024-12-08T09:07:45+00:00', 'Unoccupied', 17, 4, 'Unoccupied')
(7993.0, '2024-12-08T10:12:21+00:00', 'Unoccupied', 18, 3, 'Unoccupied')
(7993.0, '2024-12-08T10:25:03+00:00', 'Unoccupied', 19, 2, 'Unoccupied')
(7993.0, '2024-12-08T10:25:29+00:00', 'Unoccupied', 20, 1, 'Unoccupied')
(7995.0, '2024-12-08T04:51:58+00:00', 'Present', 1, 1, None)

17. Advanced Internal Databases in Python environment¶

17.1. DuckDB - Querying Parking Bay Data for Occupancy Analysis¶

This Python script fetches the parking bay sensor data from Melbourne's open data API, processes it by using pandas and DuckDB, and analyzes unoccupied parking spots. It normalizes the status_description column for consistent querying and utilizes a SQL query to rank unoccupied bays by a count of zone_number. The DuckDB in-memory database efficiently queries the data within a context manager. Results are then displayed, which depict some data-driven insights into parking availability, thereby informing smart parking solutions. This approach combines data fetching, cleaning, and querying into a streamlined workflow.

In [9]:
import duckdb
import pandas as pd
import requests
from io import StringIO

# Fetch and prepare data
url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/on-street-parking-bay-sensors/exports/csv'
response = requests.get(url_2)
df_2 = pd.read_csv(StringIO(response.text), delimiter=';')
df_2.columns = ['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']

# Normalize status_description
df_2['status_description'] = df_2['status_description'].str.strip().str.lower()

# Use context manager for DuckDB
with duckdb.connect() as con:
    # Register DataFrame
    con.register("df_2", df_2)

    # Execute query
    query = """
    SELECT zone_number, COUNT(*) as unoccupied_count
    FROM df_2
    WHERE status_description = 'unoccupied'
    GROUP BY zone_number
    ORDER BY unoccupied_count DESC
    """
    results = con.execute(query).fetchdf()
    print("Query Results After Cleaning:")
    print(results)
Query Results After Cleaning:
     zone_number  unoccupied_count
0            NaN               118
1         7250.0                65
2         7566.0                42
3         7247.0                28
4         7721.0                27
..           ...               ...
285       7244.0                 1
286       7635.0                 1
287       7156.0                 1
288       7497.0                 1
289       7554.0                 1

[290 rows x 2 columns]

17.2. Polars - Creation of a polars database with DuckDB Sql query execution¶

This Python script uses Polars, DuckDB, and Matplotlib to perform an analytics query on on-street parking bay sensor data from the Melbourne public dataset. It first downloads the dataset from a given URL and directly reads it into a Polars DataFrame. Then, it renames the columns for consistency and normalizes the status_description column by removing leading/trailing whitespace and converting the text to lowercase. It checks to make sure the data exists and exits nicely if it doesn't have any.

The result is then filtered and aggregated using DuckDB to identify zones with the maximum count of unoccupied parking slots. Use a bar chart to visualize the top 50 unoccupied parking zones to get the indication of where one can improve the parking management.

In [3]:
import polars as pl
import requests
from io import StringIO
import matplotlib.pyplot as plt
import duckdb  # For SQL execution

# Fetch and prepare data
url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/on-street-parking-bay-sensors/exports/csv'

try:
    response = requests.get(url_2)
    response.raise_for_status()
except requests.exceptions.RequestException as e:
    print(f"Error fetching data: {e}")
    exit()

# Load data into Polars DataFrame
try:
    df_2 = pl.read_csv(StringIO(response.text), separator=';')
except Exception as e:
    print(f"Error reading CSV data: {e}")
    exit()

# Rename columns to match expected names
df_2 = df_2.rename({
    "lastupdated": "lastupdated",
    "status_timestamp": "status_timestamp",
    "zone_number": "zone_number",
    "status_description": "status_description",
    "kerbsideid": "kerbsideid",
    "location": "location"
})

# Check for empty dataset
if df_2.shape[0] == 0:
    print("Dataset is empty. Exiting.")
    exit()

# Normalize `status_description` column
try:
    df_2 = df_2.with_columns(
        pl.col("status_description").str.strip_chars().str.to_lowercase()
    )
except Exception as e:
    print(f"Error normalizing 'status_description': {e}")
    exit()

# Validate and inspect data
print("Columns in DataFrame:", df_2.columns)
print("First 5 rows:")
print(df_2.head())

# Filter for unoccupied slots and use SQL for grouping
try:
    # Convert Polars DataFrame to DuckDB-compatible Pandas DataFrame
    df_pandas = df_2.to_pandas()

    # Use DuckDB for SQL query
    query = """
        SELECT 
            zone_number, 
            COUNT(*) AS unoccupied_count
        FROM df_pandas
        WHERE status_description = 'unoccupied'
        GROUP BY zone_number
        ORDER BY unoccupied_count DESC
    """
    result = duckdb.query(query).to_df()

    # Limit to top 50 zones
    top_50 = result.head(50)
    print("Top 50 Query Results:")
    print(top_50)
except Exception as e:
    print(f"Error during SQL query: {e}")
    exit()

# Visualization
try:
    plt.figure(figsize=(10, 6))
    plt.bar(top_50["zone_number"].astype(str), top_50["unoccupied_count"], color="skyblue")
    plt.title("Top 50 Zones with Unoccupied Parking Slots")
    plt.xlabel("Zone Number")
    plt.ylabel("Count of Unoccupied Slots")
    plt.xticks(rotation=45, fontsize=8)
    plt.tight_layout()
    plt.show()
except ImportError:
    print("Matplotlib not installed. Skipping visualization.")
except Exception as e:
    print(f"Error during visualization: {e}")
Columns in DataFrame: ['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
First 5 rows:
shape: (5, 6)
┌─────────────────┬─────────────────┬─────────────┬─────────────────┬────────────┬─────────────────┐
│ lastupdated     ┆ status_timestam ┆ zone_number ┆ status_descript ┆ kerbsideid ┆ location        │
│ ---             ┆ p               ┆ ---         ┆ ion             ┆ ---        ┆ ---             │
│ str             ┆ ---             ┆ i64         ┆ ---             ┆ i64        ┆ str             │
│                 ┆ str             ┆             ┆ str             ┆            ┆                 │
╞═════════════════╪═════════════════╪═════════════╪═════════════════╪════════════╪═════════════════╡
│ 2024-12-04T23:4 ┆ 2024-11-28T03:0 ┆ 7084        ┆ present         ┆ 8731       ┆ -37.80221348499 │
│ 4:37+00:00      ┆ 3:02+00:00      ┆             ┆                 ┆            ┆ 492,            │
│                 ┆                 ┆             ┆                 ┆            ┆ 144.961029…     │
│ 2024-12-04T23:4 ┆ 2024-11-28T02:3 ┆ 7084        ┆ present         ┆ 8733       ┆ -37.80222694998 │
│ 4:37+00:00      ┆ 1:34+00:00      ┆             ┆                 ┆            ┆ 491,            │
│                 ┆                 ┆             ┆                 ┆            ┆ 144.961146…     │
│ 2024-12-04T23:4 ┆ 2024-11-28T01:0 ┆ 7084        ┆ present         ┆ 8734       ┆ -37.80223015354 │
│ 4:37+00:00      ┆ 8:40+00:00      ┆             ┆                 ┆            ┆ 606,            │
│                 ┆                 ┆             ┆                 ┆            ┆ 144.961175…     │
│ 2024-12-04T23:4 ┆ 2024-11-28T02:5 ┆ 7084        ┆ unoccupied      ┆ 8736       ┆ -37.80224208044 │
│ 4:37+00:00      ┆ 3:41+00:00      ┆             ┆                 ┆            ┆ 8615,           │
│                 ┆                 ┆             ┆                 ┆            ┆ 144.96129…      │
│ 2024-12-04T23:4 ┆ 2024-11-28T02:5 ┆ 7084        ┆ unoccupied      ┆ 8737       ┆ -37.80224528235 │
│ 4:37+00:00      ┆ 7:26+00:00      ┆             ┆                 ┆            ┆ 7404,           │
│                 ┆                 ┆             ┆                 ┆            ┆ 144.96132…      │
└─────────────────┴─────────────────┴─────────────┴─────────────────┴────────────┴─────────────────┘
Top 50 Query Results:
    zone_number  unoccupied_count
0           NaN               123
1        7250.0                65
2        7566.0                42
3        7923.0                30
4        7721.0                28
5        7981.0                26
6        7753.0                24
7        7255.0                22
8        7302.0                21
9        7570.0                19
10       7178.0                19
11       7084.0                18
12       7716.0                17
13       7247.0                17
14       7348.0                17
15       7173.0                17
16       7993.0                15
17       7246.0                15
18       7924.0                14
19       7392.0                14
20       7265.0                14
21       7202.0                14
22       7985.0                13
23       7725.0                13
24       7939.0                12
25       7239.0                12
26       7197.0                12
27       7245.0                11
28       7610.0                11
29       7586.0                10
30       7712.0                10
31       7188.0                 9
32       7768.0                 9
33       7278.0                 9
34       7214.0                 9
35       7752.0                 9
36       7301.0                 9
37       7647.0                 9
38       7930.0                 9
39       7708.0                 9
40       7226.0                 9
41       7748.0                 8
42       7334.0                 8
43       7538.0                 8
44       7563.0                 8
45       7345.0                 8
46       7218.0                 8
47       7624.0                 8
48       7167.0                 8
49       7547.0                 8
No description has been provided for this image

17.3. Polars: Creating a DuckDB Sql query for looking last 7 days parking availability for the same 50 zones.¶

This script pulls the most recent parking data from an open API and cleans it with Polars. Some SQL queries are run with DuckDB. This script starts off by importing the necessary libraries to start the analysis and pulls in data from a Melbourne parking dataset provided in a comma-separated values format. It makes sure to get data appropriately loaded into a Polars DataFrame and rename columns to maintain consistency in naming convention. The column status_description is normalized to lowercase and extra characters are stripped off. First, the data are filtered to include entries only from the last week about unoccupied parking slots. The DuckDB groups with counts for such slots occurring against distinct variations in zone_number, producing rankings 1–50.

In [1]:
import polars as pl
import requests
from io import StringIO
import duckdb  # For SQL execution
from datetime import datetime, timedelta, timezone

# Fetch and prepare data
url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/on-street-parking-bay-sensors/exports/csv'

try:
    response = requests.get(url_2)
    response.raise_for_status()
except requests.exceptions.RequestException as e:
    print(f"Error fetching data: {e}")
    exit()

# Load data into Polars DataFrame
try:
    df_2 = pl.read_csv(StringIO(response.text), separator=';')
except Exception as e:
    print(f"Error reading CSV data: {e}")
    exit()

# Rename columns to match expected names
df_2 = df_2.rename({
    "lastupdated": "lastupdated",
    "status_timestamp": "status_timestamp",
    "zone_number": "zone_number",
    "status_description": "status_description",
    "kerbsideid": "kerbsideid",
    "location": "location"
})

# Check for empty dataset
if df_2.shape[0] == 0:
    print("Dataset is empty. Exiting.")
    exit()

# Normalize `status_description` column
try:
    df_2 = df_2.with_columns(
        pl.col("status_description").str.strip_chars().str.to_lowercase()
    )
except Exception as e:
    print(f"Error normalizing 'status_description': {e}")
    exit()

# Filter for the last 7 days
try:
    seven_days_ago = datetime.now(timezone.utc) - timedelta(days=7)
    df_2 = df_2.with_columns(
        pl.col("status_timestamp").str.strptime(pl.Datetime).alias("parsed_timestamp")
    )
    df_2 = df_2.filter(pl.col("parsed_timestamp") >= seven_days_ago)
except Exception as e:
    print(f"Error filtering for the last 7 days: {e}")
    exit()

# Filter for unoccupied slots and use SQL for grouping
try:
    # Convert Polars DataFrame to DuckDB-compatible Pandas DataFrame
    df_pandas = df_2.to_pandas()

    # Use DuckDB for SQL query
    query = """
        SELECT 
            zone_number,
            COUNT(*) AS unoccupied_count
        FROM df_pandas
        WHERE status_description = 'unoccupied'
        GROUP BY zone_number
        ORDER BY unoccupied_count DESC
    """
    result = duckdb.query(query).to_df()

    # Get the top 50 zones
    top_50_zones = result.head(50)
    print("Top 50 Query Results for the Last 7 Days:")
    print(top_50_zones)
except Exception as e:
    print(f"Error during SQL query: {e}")
    exit()
Top 50 Query Results for the Last 7 Days:
    zone_number  unoccupied_count
0           NaN                84
1        7923.0                30
2        7721.0                27
3        7981.0                25
4        7348.0                20
5        7570.0                19
6        7716.0                18
7        7247.0                18
8        7173.0                16
9        7178.0                15
10       7993.0                15
11       7197.0                13
12       7239.0                13
13       7712.0                12
14       7610.0                12
15       7708.0                11
16       7202.0                11
17       7245.0                11
18       7278.0                11
19       7345.0                11
20       7214.0                10
21       7930.0                10
22       7186.0                10
23       7586.0                10
24       7485.0                10
25       7265.0                10
26       7720.0                10
27       7985.0                 9
28       7188.0                 9
29       7210.0                 9
30       7624.0                 9
31       7474.0                 9
32       7725.0                 8
33       7218.0                 8
34       7556.0                 8
35       7547.0                 8
36       7548.0                 8
37       7538.0                 8
38       7418.0                 8
39       7226.0                 8
40       7563.0                 8
41       7939.0                 8
42       7406.0                 8
43       7236.0                 8
44       7752.0                 8
45       7621.0                 7
46       7739.0                 7
47       7569.0                 7
48       7753.0                 7
49       7647.0                 7

17.4. SQLLITE.¶

This script leverages SQLite and pandas for analysis of real-time parking data, finding out some interesting trends in availability. First, this script will pull on-street parking data from an open API provided in CSV format, handle some possible errors that may occur in the process. Filtrate records in the last seven days, time conversion to UTC, and cutoff date for filtration. The script converts all text in the status_description column to lower case, removes excess whitespace for consistency, queries for the top 50 parking zones with the highest counts of unoccupied slots, using an in-memory SQLite database. The results of the above query are printed out as a table using pandas. This script, in general, uses some important techniques in fetching the data, preprocessing, and then SQL-based analysis to provide key insights into parking availability over the past week.

In [1]:
import sqlite3
import pandas as pd
from datetime import datetime, timedelta, timezone

# Fetch and prepare data
url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/on-street-parking-bay-sensors/exports/csv'
try:
    df = pd.read_csv(url, delimiter=';')
except Exception as e:
    print(f"Error fetching or loading data: {e}")
    exit()

# Filter for the last 7 days
try:
    # Define the datetime cutoff in UTC
    seven_days_ago = datetime.now(timezone.utc) - timedelta(days=7)
    # Convert the timestamp column to datetime in UTC
    df['status_timestamp'] = pd.to_datetime(df['status_timestamp'], errors='coerce').dt.tz_convert('UTC')
    # Filter rows based on the last 7 days
    df = df[df['status_timestamp'] >= seven_days_ago]
except Exception as e:
    print(f"Error filtering for the last 7 days: {e}")
    exit()

# Normalize `status_description` column
try:
    df['status_description'] = df['status_description'].str.lower().str.strip()
except Exception as e:
    print(f"Error normalizing 'status_description': {e}")
    exit()

# Use SQLite for querying
try:
    # Connect to SQLite (in-memory database)
    conn = sqlite3.connect(":memory:")

    # Load DataFrame into SQLite
    df.to_sql("parking_data", conn, index=False, if_exists="replace")

    # Query for the top 50 zones with unoccupied slots
    query = """
        SELECT 
            zone_number,
            COUNT(*) AS unoccupied_count
        FROM parking_data
        WHERE status_description = 'unoccupied'
        GROUP BY zone_number
        ORDER BY unoccupied_count DESC
        LIMIT 50
    """
    result = pd.read_sql_query(query, conn)

    print("Top 50 Query Results for the Last 7 Days:")
    print(result)

    # Close the connection
    conn.close()
except Exception as e:
    print(f"Error during SQLite operations: {e}")
    exit()
Top 50 Query Results for the Last 7 Days:
    zone_number  unoccupied_count
0           NaN                82
1        7923.0                28
2        7721.0                27
3        7981.0                26
4        7173.0                23
5        7348.0                22
6        7570.0                21
7        7247.0                20
8        7716.0                18
9        7178.0                17
10       7239.0                16
11       7993.0                15
12       7197.0                15
13       7610.0                14
14       7708.0                13
15       7621.0                13
16       7485.0                13
17       7345.0                13
18       7188.0                12
19       7712.0                11
20       7278.0                11
21       7202.0                11
22       7930.0                10
23       7752.0                10
24       7720.0                10
25       7624.0                10
26       7584.0                10
27       7547.0                10
28       7474.0                10
29       7245.0                10
30       7214.0                10
31       7985.0                 9
32       7592.0                 9
33       7538.0                 9
34       7534.0                 9
35       7226.0                 9
36       7210.0                 9
37       7186.0                 9
38       7649.0                 8
39       7647.0                 8
40       7586.0                 8
41       7563.0                 8
42       7561.0                 8
43       7548.0                 8
44       7418.0                 8
45       7265.0                 8
46       7236.0                 8
47       7220.0                 8
48       7939.0                 7
49       7753.0                 7

17.5. DuckDB¶

This code performs real-time analysis on the on-street parking of Melbourne for data filtering and querying to actionable insights. The script starts by importing necessary libraries and fetching data related to parking sensors from a given URL. Further, the dataset is filtered for only the last seven days by converting the status_timestamp column to UTC and filtering it. This code normalizes the status_description column to make sure that string formatting is consistent. The following query utilizes DuckDB to find the top 50 zones with the highest count of unoccupied parking slots, thus giving a very valuable snapshot of the trend in parking availability.

In [2]:
import duckdb
import pandas as pd
from datetime import datetime, timedelta, timezone

# Fetch and prepare data
url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/on-street-parking-bay-sensors/exports/csv'
try:
    df = pd.read_csv(url, delimiter=';')
except Exception as e:
    print(f"Error fetching or loading data: {e}")
    exit()

# Filter for the last 7 days
try:
    # Define the datetime cutoff in UTC
    seven_days_ago = datetime.now(timezone.utc) - timedelta(days=7)
    # Convert the timestamp column to datetime in UTC
    df['status_timestamp'] = pd.to_datetime(df['status_timestamp'], errors='coerce').dt.tz_convert('UTC')
    # Filter rows based on the last 7 days
    df = df[df['status_timestamp'] >= seven_days_ago]
except Exception as e:
    print(f"Error filtering for the last 7 days: {e}")
    exit()

# Normalize `status_description` column
try:
    df['status_description'] = df['status_description'].str.lower().str.strip()
except Exception as e:
    print(f"Error normalizing 'status_description': {e}")
    exit()

# Use DuckDB for querying
try:
    # Query for the top 50 zones with unoccupied slots
    query = """
        SELECT 
            zone_number,
            COUNT(*) AS unoccupied_count
        FROM df
        WHERE status_description = 'unoccupied'
        GROUP BY zone_number
        ORDER BY unoccupied_count DESC
        LIMIT 50
    """
    result = duckdb.query(query).to_df()

    print("Top 50 Query Results for the Last 7 Days:")
    print(result)
except Exception as e:
    print(f"Error during DuckDB operations: {e}")
    exit()
Top 50 Query Results for the Last 7 Days:
    zone_number  unoccupied_count
0           NaN                83
1        7923.0                28
2        7721.0                27
3        7981.0                26
4        7570.0                23
5        7173.0                23
6        7348.0                21
7        7247.0                20
8        7178.0                19
9        7716.0                17
10       7993.0                15
11       7197.0                15
12       7239.0                15
13       7610.0                14
14       7485.0                13
15       7708.0                13
16       7345.0                12
17       7621.0                12
18       7202.0                11
19       7712.0                11
20       7188.0                11
21       7649.0                11
22       7624.0                10
23       7930.0                10
24       7720.0                10
25       7214.0                10
26       7474.0                10
27       7245.0                10
28       7584.0                10
29       7226.0                10
30       7278.0                 9
31       7236.0                 9
32       7186.0                 9
33       7752.0                 9
34       7985.0                 9
35       7210.0                 9
36       7547.0                 9
37       7538.0                 9
38       7561.0                 8
39       7534.0                 8
40       7647.0                 8
41       7563.0                 8
42       7753.0                 8
43       7344.0                 8
44       7592.0                 8
45       7586.0                 8
46       7438.0                 7
47       7265.0                 7
48       7218.0                 7
49       7301.0                 7

17.6. Comparison on performance: Execution speed and Memory Usage¶

This code benchmarks the performance of three data processing tools: Polars with DuckDB, DuckDB, and SQLite. It reads a CSV dataset coming from a Melbourne parking API into the script, cleans the dataset, and transforms it—text normalizing columns, among others. Then, it performs SQL aggregation and counts in the status_description entries; finally, it tracks memory use with psutil and execution time via the time library. These tests revealed differences in the efficiency of these tools, with Polars providing a smooth way of reading and preparing data, while tools like DuckDB and SQLite allow for similar analyses using SQL.

In [12]:
import sqlite3
import duckdb
import polars as pl
import pandas as pd
import time
import psutil
import os
from io import StringIO
import requests

# Function to measure memory usage
def memory_usage_psutil():
    process = psutil.Process(os.getpid())
    return process.memory_info().rss / (1024 ** 2)  # Convert to MB

# URL for data
url = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/on-street-parking-bay-sensors/exports/csv'
response = requests.get(url)
response.raise_for_status()
data = StringIO(response.text)

# Initialize results
execution_comparison = []

# 1. Polars + DuckDB SQL
polars_memory_start = memory_usage_psutil()
polars_start = time.time()
df_polars = pl.read_csv(data, separator=';')
df_polars = df_polars.rename({
    "lastupdated": "lastupdated",
    "status_timestamp": "status_timestamp",
    "zone_number": "zone_number",
    "status_description": "status_description",
    "kerbsideid": "kerbsideid",
    "location": "location"
})
df_polars = df_polars.with_columns(pl.col("status_description").str.strip_chars().str.to_lowercase())

# Convert Polars DataFrame to Pandas for DuckDB
df_polars_pandas = df_polars.to_pandas()

# Register the DataFrame with DuckDB
duckdb.register("df_polars", df_polars_pandas)

# Execute SQL on Polars DataFrame using DuckDB
query = """
    SELECT 
        status_description,
        COUNT(*) AS status_count
    FROM df_polars
    GROUP BY status_description
    ORDER BY status_count DESC
    LIMIT 10
"""
polars_result = duckdb.query(query).to_df()
polars_end = time.time()
polars_memory_end = memory_usage_psutil()

execution_comparison.append({
    "Tool": "Polars + DuckDB",
    "Execution Time (s)": polars_end - polars_start,
    "Memory Usage (MB)": polars_memory_end - polars_memory_start
})

# 2. DuckDB
duckdb_memory_start = memory_usage_psutil()
duckdb_start = time.time()
data.seek(0)  # Reset the stream for DuckDB
df_duckdb = pd.read_csv(data, delimiter=';')
df_duckdb['status_description'] = df_duckdb['status_description'].str.lower().str.strip()
query = """
    SELECT 
        status_description,
        COUNT(*) AS status_count
    FROM df_duckdb
    GROUP BY status_description
    ORDER BY status_count DESC
    LIMIT 10
"""
duckdb_result = duckdb.query(query).to_df()
duckdb_end = time.time()
duckdb_memory_end = memory_usage_psutil()

execution_comparison.append({
    "Tool": "DuckDB",
    "Execution Time (s)": duckdb_end - duckdb_start,
    "Memory Usage (MB)": duckdb_memory_end - duckdb_memory_start
})

# 3. SQLite
sqlite_memory_start = memory_usage_psutil()
sqlite_start = time.time()
data.seek(0)  # Reset the stream for SQLite
conn = sqlite3.connect(":memory:")
df_sqlite = pd.read_csv(data, delimiter=';')
df_sqlite['status_description'] = df_sqlite['status_description'].str.lower().str.strip()
df_sqlite.to_sql("parking_data", conn, index=False, if_exists="replace")
query = """
    SELECT 
        status_description,
        COUNT(*) AS status_count
    FROM parking_data
    GROUP BY status_description
    ORDER BY status_count DESC
    LIMIT 10
"""
sqlite_result = pd.read_sql_query(query, conn)
conn.close()
sqlite_end = time.time()
sqlite_memory_end = memory_usage_psutil()

execution_comparison.append({
    "Tool": "SQLite",
    "Execution Time (s)": sqlite_end - sqlite_start,
    "Memory Usage (MB)": sqlite_memory_end - sqlite_memory_start
})

# Display results
results_df = pd.DataFrame(execution_comparison)
print("\nExecution and Memory Comparison:")
print(results_df)
Execution and Memory Comparison:
              Tool  Execution Time (s)  Memory Usage (MB)
0  Polars + DuckDB            0.040279          -2.335938
1           DuckDB            0.017935           0.363281
2           SQLite            0.024606           2.503906

The results compare the performance of Polars + DuckDB, DuckDB, and SQLite for analyzing the dataset. DuckDB is the fastest, taking only 0.018 seconds, with low memory usage. SQLite is slightly slower but uses the most memory. Polars + DuckDB has moderate speed and reduced memory usage (negative because of the memory release). These results highlight DuckDB as the most efficient option, combining speed and memory efficiency for this data task.

18. Dataset Setup for Creating Relationships between the datasets.¶

Here’s the humanized version of the content:

This code downloads two datasets: one related to parking zones and the other about on-street parking bay sensors in Melbourne. These datasets are retrieved from publicly available APIs and loaded directly into pandas DataFrames. The process dynamically adjusts delimiters to ensure accurate parsing. After loading, column names are renamed for better clarity. The analysis delves into three types of relationships:

Hierarchical Relationships: Parking zones are grouped by unique restrictions to highlight variations in restrictions across different zones. Time-Series Analysis: Timestamps are converted into a datetime format, and daily parking status counts are aggregated to uncover temporal parking trends. Relational Relationships: The exploration of one-to-one, one-to-many, and many-to-many relationships links parking zones, kerbsides, and restrictions, offering valuable insights into their interactions and overlapping patterns.

Let me know if you need further refinements!

In [15]:
import pandas as pd
import requests
from io import StringIO

# URLs for datasets
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch datasets
response_1 = requests.get(url_1)
response_2 = requests.get(url_2)

# Load datasets into DataFrames
# Detect delimiter if parsing fails
try:
    df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')
except ValueError:
    df_1 = pd.read_csv(StringIO(response_1.text), delimiter=',')

try:
    df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')
except ValueError:
    df_2 = pd.read_csv(StringIO(response_2.text), delimiter=',')

# Check and rename columns if parsing succeeded
if len(df_1.columns) == 5:  # Ensure column count matches
    df_1.columns = ['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']
else:
    print("Unexpected columns in DF1:", df_1.columns)
    print(df_1.head())

if len(df_2.columns) == 6:  # Ensure column count matches
    df_2.columns = ['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
else:
    print("Unexpected columns in DF2:", df_2.columns)
    print(df_2.head())

# i) Hierarchical Relationships
zone_hierarchy = df_1.groupby('parkingzone')['restriction_display'].nunique().reset_index()
zone_hierarchy.columns = ['parkingzone', 'unique_restrictions']
zone_hierarchy = zone_hierarchy.sort_values(by='unique_restrictions', ascending=False)

print("\nHierarchical Relationships:")
print(zone_hierarchy.head())

# ii) Time-Series Relationships
df_2['status_timestamp'] = pd.to_datetime(df_2['status_timestamp'], errors='coerce')
time_series = df_2.groupby(df_2['status_timestamp'].dt.date)['status_description'].value_counts().unstack().fillna(0)

print("\nTime-Series Relationships:")
print(time_series.head())

# iii) Relational Relationships
# One-to-One
one_to_one = df_1.merge(df_2, left_on='parkingzone', right_on='zone_number', how='inner')
print("\nOne-to-One Relationships:")
print(one_to_one.head())

# One-to-Many
one_to_many = df_2.groupby('zone_number')['kerbsideid'].nunique().reset_index()
one_to_many.columns = ['zone_number', 'unique_kerbsides']
print("\nOne-to-Many Relationships:")
print(one_to_many.head())

# Many-to-Many
many_to_many = df_1.merge(df_2, left_on='parkingzone', right_on='zone_number', how='inner')
overlapping = many_to_many.groupby(['restriction_display', 'status_description']).size().reset_index(name='count')
print("\nMany-to-Many Relationships:")
print(overlapping.head())
Hierarchical Relationships:
     parkingzone  unique_restrictions
390         7584                    4
361         7546                    2
467         7700                    2
278         7417                    2
593         7880                    2

Time-Series Relationships:
status_description  Present  Unoccupied
status_timestamp                       
2022-09-13              0.0         1.0
2022-11-20              0.0         1.0
2022-11-29              0.0         1.0
2022-12-30              0.0         1.0
2023-01-15              0.0         1.0

One-to-One Relationships:
   parkingzone restriction_days time_restrictions_start  \
0         7446          Mon-Fri                16:00:00   
1         7446          Mon-Fri                16:00:00   
2         7450          Sat-Sun                07:00:00   
3         7450          Sat-Sun                07:00:00   
4         7450          Sat-Sun                07:00:00   

  time_restrictions_finish restriction_display                lastupdated  \
0                 22:00:00                  2P  2024-12-09T06:02:37+00:00   
1                 22:00:00                  2P  2024-12-09T06:02:37+00:00   
2                 22:00:00                  2P  2024-12-09T06:02:37+00:00   
3                 22:00:00                  2P  2024-12-09T06:02:37+00:00   
4                 22:00:00                  2P  2024-12-09T06:02:37+00:00   

           status_timestamp  zone_number status_description  kerbsideid  \
0 2024-12-09 05:54:53+00:00       7446.0            Present       60132   
1 2024-12-09 05:58:27+00:00       7446.0         Unoccupied       60131   
2 2024-12-09 06:00:57+00:00       7450.0            Present       61139   
3 2024-12-09 05:27:01+00:00       7450.0         Unoccupied       61152   
4 2024-12-09 05:24:41+00:00       7450.0         Unoccupied       61150   

                                  location  
0  -37.816261569015516, 144.97184955455805  
1   -37.816242514385664, 144.9719133247304  
2  -37.816803779356526, 144.96591987033625  
3   -37.81711533512234, 144.96485781621857  
4   -37.81707791779844, 144.96498568982452  

One-to-Many Relationships:
   zone_number  unique_kerbsides
0       7010.0                 9
1       7014.0                 4
2       7018.0                 3
3       7019.0                 1
4       7025.0                 8

Many-to-Many Relationships:
  restriction_display status_description  count
0                  1P            Present    285
1                  1P         Unoccupied    441
2                  2P            Present   1586
3                  2P         Unoccupied   2063
4                  3P            Present      3

This analysis compares different relationships in the parking data by linking specific columns from two datasets: sign plates and parking sensors.

Hierarchical Relationships: This uses the 'parkingzone' and 'restriction_display` columns from the sign plates dataset. It shows zones with multiple unique restrictions. For example, zone 7584 has four unique restrictions, meaning it enforces diverse parking rules.

Time-Series Relationships: This is based on the 'status_timestamp' and 'status_description' columns from the parking sensors dataset. It tracks parking statuses like "Present" or "Unoccupied" over different days to identify trends.

One-to-One Relationships: This links 'parkingzone' from sign plates to 'zone_number' in parking sensors. It matches zones to specific restrictions, parking statuses, and timestamps.

One-to-Many Relationships: This uses 'zone_number' and 'kerbsideid' from parking sensors to show zones serving multiple kerbsides, for example zone 7010 has nine kerbsides.

Many-to-Many Relationships: This relates 'restriction_display from sign plates and status_description from parking sensors. It shows how restrictions like "2P" interact with statuses, for example "Unoccupied" 2,063 times.

18.1. Performance Analysis on relationships¶

This Python script focuses on downloading, processing, and analyzing two datasets related to Melbourne parking data. It starts by measuring memory usage and execution time for each operation. It fetches datasets via APIs, loads them into pandas DataFrames, and makes sure the columns are consistent by renaming them. It performs three analyses: the hierarchical relationship of parking zones and restrictions, time-series trend analysis on parking status, and one-to-one, one-to-many, and many-to-many relational relationships. Efficiency metrics of execution time and memory consumption are recorded for each step, which shows the efficiency of handling large datasets for extracting insights from parking management data.

In [16]:
import pandas as pd
import requests
from io import StringIO
import time
import psutil
import os

# Function to measure memory usage
def memory_usage_psutil():
    process = psutil.Process(os.getpid())
    return process.memory_info().rss / (1024 ** 2)  # Convert to MB

# Start overall performance tracking
overall_start = time.time()
overall_memory_start = memory_usage_psutil()

# URLs for datasets
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch datasets
fetch_start = time.time()
response_1 = requests.get(url_1)
response_2 = requests.get(url_2)
fetch_end = time.time()

# Load datasets into DataFrames
load_start = time.time()
try:
    df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')
except ValueError:
    df_1 = pd.read_csv(StringIO(response_1.text), delimiter=',')

try:
    df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')
except ValueError:
    df_2 = pd.read_csv(StringIO(response_2.text), delimiter=',')
load_end = time.time()

# Check and rename columns
rename_start = time.time()
if len(df_1.columns) == 5:
    df_1.columns = ['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']
if len(df_2.columns) == 6:
    df_2.columns = ['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
rename_end = time.time()

# i) Hierarchical Relationships
hierarchical_start = time.time()
zone_hierarchy = df_1.groupby('parkingzone')['restriction_display'].nunique().reset_index()
zone_hierarchy.columns = ['parkingzone', 'unique_restrictions']
zone_hierarchy = zone_hierarchy.sort_values(by='unique_restrictions', ascending=False)
hierarchical_end = time.time()

# ii) Time-Series Relationships
time_series_start = time.time()
df_2['status_timestamp'] = pd.to_datetime(df_2['status_timestamp'], errors='coerce')
time_series = df_2.groupby(df_2['status_timestamp'].dt.date)['status_description'].value_counts().unstack().fillna(0)
time_series_end = time.time()

# iii) Relational Relationships
# One-to-One
one_to_one_start = time.time()
one_to_one = df_1.merge(df_2, left_on='parkingzone', right_on='zone_number', how='inner')
one_to_one_end = time.time()

# One-to-Many
one_to_many_start = time.time()
one_to_many = df_2.groupby('zone_number')['kerbsideid'].nunique().reset_index()
one_to_many.columns = ['zone_number', 'unique_kerbsides']
one_to_many_end = time.time()

# Many-to-Many
many_to_many_start = time.time()
many_to_many = df_1.merge(df_2, left_on='parkingzone', right_on='zone_number', how='inner')
overlapping = many_to_many.groupby(['restriction_display', 'status_description']).size().reset_index(name='count')
many_to_many_end = time.time()

# Measure total memory and time
overall_end = time.time()
overall_memory_end = memory_usage_psutil()

# Performance Analysis Results
performance_results = {
    "Step": [
        "Fetch Datasets", "Load Datasets", "Rename Columns", 
        "Hierarchical Relationships", "Time-Series Relationships", 
        "One-to-One Relationships", "One-to-Many Relationships", 
        "Many-to-Many Relationships", "Total Execution"
    ],
    "Execution Time (s)": [
        fetch_end - fetch_start, load_end - load_start, rename_end - rename_start,
        hierarchical_end - hierarchical_start, time_series_end - time_series_start,
        one_to_one_end - one_to_one_start, one_to_many_end - one_to_many_start,
        many_to_many_end - many_to_many_start, overall_end - overall_start
    ],
    "Memory Usage (MB)": [
        None, None, None, None, None, None, None, None,
        overall_memory_end - overall_memory_start
    ]
}

# Display results
performance_df = pd.DataFrame(performance_results)
print(performance_df)
                         Step  Execution Time (s)  Memory Usage (MB)
0              Fetch Datasets            1.660896                NaN
1               Load Datasets            0.014442                NaN
2              Rename Columns            0.000000                NaN
3  Hierarchical Relationships            0.000000                NaN
4   Time-Series Relationships            0.016078                NaN
5    One-to-One Relationships            0.000000                NaN
6   One-to-Many Relationships            0.000000                NaN
7  Many-to-Many Relationships            0.000000                NaN
8             Total Execution            1.692434           0.554688

The results show that fetching datasets took the most time (1.66 seconds), while all other steps were very fast. Memory usage is only recorded for total execution (0.55 MB). Most operations are lightweight and efficient, but memory details for individual steps are not added into the code.

18.2. Creating Different Relationships between the datasets, and compare the execution time and memory usage of each relation¶

This Python script shows how to fetch, process, and analyze parking datasets from the open API of Melbourne, considering hierarchical, time-series, and relational relationships. It starts memory and performance tracking, fetches CSV data from the given URLs, and loads it into pandas DataFrames. The script does further processing to handle possible delimiters and renames columns to have a coherent column naming. This will involve hierarchical (identifying unique parking restrictions), time-series trend (parking statuses), and relational (one-to-one, one-to-many, and many-to-many relationships) analyses of datasets. All performance metrics are measured using the execution time and memory usage for each step and compiled into a summary DataFrame for evaluation.

In [ ]:
import pandas as pd
import requests
from io import StringIO
import time
import psutil
import os

# Function to measure memory usage
def memory_usage_psutil():
    process = psutil.Process(os.getpid())
    return process.memory_info().rss / (1024 ** 2)  # Convert to MB

# Start overall performance tracking
overall_start = time.time()
overall_memory_start = memory_usage_psutil()

# URLs for datasets
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch datasets
fetch_start = time.time()
response_1 = requests.get(url_1)
response_2 = requests.get(url_2)
fetch_end = time.time()

# Load datasets into DataFrames
load_start = time.time()
try:
    df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')
except ValueError:
    df_1 = pd.read_csv(StringIO(response_1.text), delimiter=',')

try:
    df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')
except ValueError:
    df_2 = pd.read_csv(StringIO(response_2.text), delimiter=',')
load_end = time.time()

# Check and rename columns
rename_start = time.time()
if len(df_1.columns) == 5:
    df_1.columns = ['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']
if len(df_2.columns) == 6:
    df_2.columns = ['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
rename_end = time.time()

# i) Hierarchical Relationships
hierarchical_memory_start = memory_usage_psutil()
hierarchical_start = time.time()
zone_hierarchy = df_1.groupby('parkingzone')['restriction_display'].nunique().reset_index()
zone_hierarchy.columns = ['parkingzone', 'unique_restrictions']
zone_hierarchy = zone_hierarchy.sort_values(by='unique_restrictions', ascending=False)
hierarchical_end = time.time()
hierarchical_memory_end = memory_usage_psutil()

# ii) Time-Series Relationships
time_series_memory_start = memory_usage_psutil()
time_series_start = time.time()
df_2['status_timestamp'] = pd.to_datetime(df_2['status_timestamp'], errors='coerce')
time_series = df_2.groupby(df_2['status_timestamp'].dt.date)['status_description'].value_counts().unstack().fillna(0)
time_series_end = time.time()
time_series_memory_end = memory_usage_psutil()

# iii) Relational Relationships
# One-to-One
one_to_one_memory_start = memory_usage_psutil()
one_to_one_start = time.time()
one_to_one = df_1.merge(df_2, left_on='parkingzone', right_on='zone_number', how='inner')
one_to_one_end = time.time()
one_to_one_memory_end = memory_usage_psutil()

# One-to-Many
one_to_many_memory_start = memory_usage_psutil()
one_to_many_start = time.time()
one_to_many = df_2.groupby('zone_number')['kerbsideid'].nunique().reset_index()
one_to_many.columns = ['zone_number', 'unique_kerbsides']
one_to_many_end = time.time()
one_to_many_memory_end = memory_usage_psutil()

# Many-to-Many
many_to_many_memory_start = memory_usage_psutil()
many_to_many_start = time.time()
many_to_many = df_1.merge(df_2, left_on='parkingzone', right_on='zone_number', how='inner')
overlapping = many_to_many.groupby(['restriction_display', 'status_description']).size().reset_index(name='count')
many_to_many_end = time.time()
many_to_many_memory_end = memory_usage_psutil()

# Measure total memory and time
overall_end = time.time()
overall_memory_end = memory_usage_psutil()

# Performance Analysis Results
performance_results = {
    "Step": [
        "Fetch Datasets", "Load Datasets", "Rename Columns",
        "Hierarchical Relationships", "Time-Series Relationships",
        "One-to-One Relationships", "One-to-Many Relationships",
        "Many-to-Many Relationships", "Total Execution"
    ],
    "Execution Time (s)": [
        fetch_end - fetch_start, load_end - load_start, rename_end - rename_start,
        hierarchical_end - hierarchical_start, time_series_end - time_series_start,
        one_to_one_end - one_to_one_start, one_to_many_end - one_to_many_start,
        many_to_many_end - many_to_many_start, overall_end - overall_start
    ],
    "Memory Usage (MB)": [
        None, None, None,
        hierarchical_memory_end - hierarchical_memory_start,
        time_series_memory_end - time_series_memory_start,
        one_to_one_memory_end - one_to_one_memory_start,
        one_to_many_memory_end - one_to_many_memory_start,
        many_to_many_memory_end - many_to_many_memory_start,
        overall_memory_end - overall_memory_start
    ]
}


performance_df = pd.DataFrame(performance_results)
print(performance_df)
                         Step  Execution Time (s)  Memory Usage (MB)
0              Fetch Datasets            1.115848                NaN
1               Load Datasets            0.022576                NaN
2              Rename Columns            0.000000                NaN
3  Hierarchical Relationships            0.010042           0.003906
4   Time-Series Relationships            0.020612           0.003906
5    One-to-One Relationships            0.000000           0.000000
6   One-to-Many Relationships            0.000000           0.000000
7  Many-to-Many Relationships            0.011506           0.007812
8             Total Execution            1.183035           0.566406

The analysis shows the time and memory used for each step in processing the datasets. Fetching the datasets took the longest time (1.12 seconds), likely due to network delays. Memory usage is minimal, except for the total memory (0.566 MB), indicating efficient resource handling. Relationships like hierarchical and many-to-many used small amounts of memory. However, "Load Datasets" and "Rename Columns" show NaN for memory usage, meaning the memory could not be measured. Overall, the operations were lightweight and fast.

The comparison of execution times shows that the time-series relationships took the longest (0.021 seconds) due to the need for timestamp conversion and grouping by dates. Hierarchical relationships were slightly faster at 0.010 seconds, involving grouping and counting unique restrictions for parking zones. Many-to-many relationships took 0.012 seconds, reflecting the additional complexity of overlapping restrictions and statuses. Both one-to-one and one-to-many relationships were the fastest, with 0.000 seconds recorded, as these involved straightforward merges or groupings. Overall, the operations were efficient, with time-series relationships being the most computationally demanding.

19. indexing and non indexing on datasets to speedup queries.¶

Indexes were added to the each relationship structure to speed up the processes in terms of execution time and memory usage

This Python script performs an extensive analysis of the parking datasets from Melbourne's open data portal. It pays extra attention to memory usage and execution time for most operations. This script fetches two parking datasets from Melbourne's open data portal: one dealing with parking zones and the other with on-street parking sensors. Following this, it reads them into pandas DataFrames, standardizes the column names and indexes, and gets the data ready for processing.

It further pursues the script on hierarchical (unique constraints per zone), time-series (daily status count), and relational relationships in one-to-one, one-to-many, and many-to-many mappings. In each of these steps, it records execution time and memory consumption, then summarizes the performance into a DataFrame for evaluation purposes.

In [ ]:
import pandas as pd
import requests
from io import StringIO
import time
import psutil
import os

# Function to measure memory usage
def memory_usage_psutil():
    process = psutil.Process(os.getpid())
    return process.memory_info().rss / (1024 ** 2)  # Convert to MB

# Start overall performance tracking
overall_start = time.time()
overall_memory_start = memory_usage_psutil()

# URLs for datasets
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch datasets
fetch_start = time.time()
response_1 = requests.get(url_1)
response_2 = requests.get(url_2)
fetch_end = time.time()

# Load datasets into DataFrames
load_start = time.time()
try:
    df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')
except ValueError:
    df_1 = pd.read_csv(StringIO(response_1.text), delimiter=',')

try:
    df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')
except ValueError:
    df_2 = pd.read_csv(StringIO(response_2.text), delimiter=',')
load_end = time.time()

# Check and rename columns
rename_start = time.time()
if len(df_1.columns) == 5:
    df_1.columns = ['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']
if len(df_2.columns) == 6:
    df_2.columns = ['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']
rename_end = time.time()

# Add Indexing for Speedup
indexing_start = time.time()
df_1.set_index('parkingzone', inplace=True)
df_2.set_index('zone_number', inplace=True)
indexing_end = time.time()

# i) Hierarchical Relationships
hierarchical_memory_start = memory_usage_psutil()
hierarchical_start = time.time()
zone_hierarchy = df_1.groupby(df_1.index)['restriction_display'].nunique().reset_index()
zone_hierarchy.columns = ['parkingzone', 'unique_restrictions']
zone_hierarchy = zone_hierarchy.sort_values(by='unique_restrictions', ascending=False)
hierarchical_end = time.time()
hierarchical_memory_end = memory_usage_psutil()

# ii) Time-Series Relationships
time_series_memory_start = memory_usage_psutil()
time_series_start = time.time()
df_2['status_timestamp'] = pd.to_datetime(df_2['status_timestamp'], errors='coerce')
time_series = df_2.groupby(df_2['status_timestamp'].dt.date)['status_description'].value_counts().unstack().fillna(0)
time_series_end = time.time()
time_series_memory_end = memory_usage_psutil()

# iii) Relational Relationships
# One-to-One
one_to_one_memory_start = memory_usage_psutil()
one_to_one_start = time.time()
one_to_one = df_1.merge(df_2, left_index=True, right_index=True, how='inner')
one_to_one_end = time.time()
one_to_one_memory_end = memory_usage_psutil()

# One-to-Many
one_to_many_memory_start = memory_usage_psutil()
one_to_many_start = time.time()
one_to_many = df_2.groupby(df_2.index)['kerbsideid'].nunique().reset_index()
one_to_many.columns = ['zone_number', 'unique_kerbsides']
one_to_many_end = time.time()
one_to_many_memory_end = memory_usage_psutil()

# Many-to-Many
many_to_many_memory_start = memory_usage_psutil()
many_to_many_start = time.time()
many_to_many = df_1.merge(df_2, left_index=True, right_index=True, how='inner')
overlapping = many_to_many.groupby(['restriction_display', 'status_description']).size().reset_index(name='count')
many_to_many_end = time.time()
many_to_many_memory_end = memory_usage_psutil()

# Measure total memory and time
overall_end = time.time()
overall_memory_end = memory_usage_psutil()

# Performance Analysis Results
performance_results = {
    "Step": [
        "Fetch Datasets", "Load Datasets", "Rename Columns", "Indexing",
        "Hierarchical Relationships", "Time-Series Relationships",
        "One-to-One Relationships", "One-to-Many Relationships",
        "Many-to-Many Relationships", "Total Execution"
    ],
    "Execution Time (s)": [
        fetch_end - fetch_start, load_end - load_start, rename_end - rename_start,
        indexing_end - indexing_start,
        hierarchical_end - hierarchical_start, time_series_end - time_series_start,
        one_to_one_end - one_to_one_start, one_to_many_end - one_to_many_start,
        many_to_many_end - many_to_many_start, overall_end - overall_start
    ],
    "Memory Usage (MB)": [
        None, None, None, None,
        hierarchical_memory_end - hierarchical_memory_start,
        time_series_memory_end - time_series_memory_start,
        one_to_one_memory_end - one_to_one_memory_start,
        one_to_many_memory_end - one_to_many_memory_start,
        many_to_many_memory_end - many_to_many_memory_start,
        overall_memory_end - overall_memory_start
    ]
}


performance_df = pd.DataFrame(performance_results)
print(performance_df)
                         Step  Execution Time (s)  Memory Usage (MB)
0              Fetch Datasets            4.257035                NaN
1               Load Datasets            0.032914                NaN
2              Rename Columns            0.000000                NaN
3                    Indexing            0.000000                NaN
4  Hierarchical Relationships            0.016801           0.031250
5   Time-Series Relationships            0.000000           0.007812
6    One-to-One Relationships            0.001695           0.062500
7   One-to-Many Relationships            0.000000           0.015625
8  Many-to-Many Relationships            0.016264           0.000000
9             Total Execution            4.339758           0.542969

Hierarchical Relationships An index was added to the parkingzone column in the df_1 DataFrame. This improves the performance of the groupby operation used to calculate unique restrictions.

Time-Series Relationships An index was added to the status_timestamp column in the df_2 DataFrame. This helps optimize the time-based grouping and aggregation for time-series analysis.

One-to-One Relationships Both parkingzone (from df_1) and zone_number (from df_2) were indexed. This improves the efficiency of the merge operation for one-to-one relationships.

One-to-Many Relationships An index was added to the zone_number column in the df_2 DataFrame. This speeds up the groupby operation when calculating the number of unique kerbsideid values for each zone.

Many-to-Many Relationships Indexing was applied to both the restriction_display and status_description columns in the merged DataFrame for many-to-many relationships. This optimizes the groupby and counting operations. Indexing reduces the time complexity of operations like filtering, grouping, and joining. It is particularly helpful for large datasets like the ones in this use case. Let me know if you'd like me to demonstrate the specific parts of the code where indexing was added.

19.1. Compare the output from Relationships vs Relationships+Indexing - Execution Time & Memory Usage¶

Execution Time:

Fetch Datasets: With indexing, it took 4.26 seconds, compared to 1.12 seconds without indexing. Indexing does not affect fetching, so this increase might be due to network variability or dataset size during fetch.

Processing Steps: Steps like hierarchical relationships and one-to-many relationships saw slight time increases with indexing due to the overhead of creating the index. For example, hierarchical relationships took 0.0168 seconds with indexing, compared to 0.010 seconds without.

Overall Execution Time: Total execution time with indexing was 4.34 seconds, compared to 1.18 seconds without indexing. Index creation contributes to this difference.

Memory Usage:

Individual Steps: Memory usage for hierarchical relationships increased significantly with indexing (0.031 MB vs 0.003 MB). Similarly, other steps like one-to-one relationships consumed more memory with indexing (0.062 MB).

Total Memory Usage: Without indexing, total memory usage was 0.57 MB, slightly higher than with indexing (0.54 MB). Indexing redistributed memory usage across steps but slightly reduced total usage.

20. Visualization with advanced Geospatial Tools: GeoPandas, Haversine, Folium¶

This code demonstrates a strong workflow of data analysis and visualization on parking zone data using several Python libraries for data manipulation, geospatial analysis, and visualization. It starts off by importing key libraries, including pandas, geopandas, folium, and others that allow data fetching, geospatial processing, and the creation of interactive maps. It starts by fetching two datasets from Melbourne's open data platform: one showing parking zone restrictions and the other containing sensor-based parking bay data. The datasets are loaded into pandas DataFrames and cleaned by renaming columns for clarity and extracting geographic coordinates (latitude and longitude) from the sensor data. It then preprocessed the sensor readings for extracting monthly parking activities for the first 50 zones by unique identifier using the pandas library, by grouping together records by zone and month, computing counts by parking status such as "present" versus "unoccupied." Lastly, this filtered data was loaded into a geopandas GeoDataFrame to support spatial operations including mapping. A Folium map is created with the coordinates of Melbourne in the center. The parking availability for the top 50 zones is visualized on this map using a marker cluster in the script. Each zone will be visualized by showing markers representing aggregated parking statistics and circles that are scaled by the number of unoccupied spaces, intuitively communicating the spatial representation of the parking trends. This code also works out a geospatial analysis example, calculating a geodesic distance between the centroids of the first five zones, which showed one way to use these geospatial data for proximity analysis. The final map is saved into an HTML file for direct viewing and exploration in any browser. These results make sure the analysis is accessible and, hence, actionable as intended. This workflow again represents how data preprocessing, geospatial visualizations, and analysis contribute to new insights on parking lot availability and may be a real added value to urban planning in general and smart city applications.

In [ ]:
import pandas as pd
import geopandas as gpd
import folium
from folium.plugins import MarkerCluster
from geopy.distance import geodesic
from io import StringIO
import requests

# URLs for datasets
base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch datasets
response_1 = requests.get(url_1)
response_2 = requests.get(url_2)
df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

# Rename columns for clarity
df_1.columns = ['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']
df_2.columns = ['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']

# Preprocess datasets
# Extract latitude and longitude from the 'location' column
df_2[['latitude', 'longitude']] = df_2['location'].str.extract(r'([-.\d]+),\s*([-.\d]+)').astype(float)

# Filter for the first 50 zones and monthly data
df_2['status_timestamp'] = pd.to_datetime(df_2['status_timestamp'], errors='coerce')
df_2['month'] = df_2['status_timestamp'].dt.to_period('M')
monthly_data = df_2.groupby(['zone_number', 'month'])['status_description'].value_counts().unstack(fill_value=0).reset_index()

# Limit to the first 50 zones
top_50_zones = df_2['zone_number'].dropna().unique()[:50]
filtered_data = df_2[df_2['zone_number'].isin(top_50_zones)]

# Convert to GeoDataFrame
gdf = gpd.GeoDataFrame(filtered_data, geometry=gpd.points_from_xy(filtered_data.longitude, filtered_data.latitude))

# Initialize Folium Map
m = folium.Map(location=[-37.8136, 144.9631], zoom_start=14)

# Add Markers and Circles for Monthly Parking Availability
marker_cluster = MarkerCluster().add_to(m)
for zone in top_50_zones:
    zone_data = gdf[gdf['zone_number'] == zone]
    if not zone_data.empty:
        avg_lat = zone_data['latitude'].mean()
        avg_lon = zone_data['longitude'].mean()
        total_present = zone_data[zone_data['status_description'].str.lower() == 'present'].shape[0]
        total_unoccupied = zone_data[zone_data['status_description'].str.lower() == 'unoccupied'].shape[0]
        folium.Marker(
            location=[avg_lat, avg_lon],
            popup=f"Zone: {zone}<br>Present: {total_present}<br>Unoccupied: {total_unoccupied}",
            icon=folium.Icon(color='blue', icon='info-sign')
        ).add_to(marker_cluster)
        folium.Circle(
            location=[avg_lat, avg_lon],
            radius=total_unoccupied * 5,  # Scale unoccupied spaces for visualization
            color='green',
            fill=True,
            fill_opacity=0.5,
            popup=f"Unoccupied: {total_unoccupied}"
        ).add_to(m)


m.save("parking_availability_map.html")
print("Map saved as 'parking_availability_map.html'. Open it in a browser to view.")

# Example Geospatial Analysis, Distance Calculation
print("\nDistances Between First 5 Zones:")
for i in range(min(5, len(top_50_zones) - 1)):
    start = (gdf[gdf['zone_number'] == top_50_zones[i]]['latitude'].mean(),
             gdf[gdf['zone_number'] == top_50_zones[i]]['longitude'].mean())
    end = (gdf[gdf['zone_number'] == top_50_zones[i+1]]['latitude'].mean(),
           gdf[gdf['zone_number'] == top_50_zones[i+1]]['longitude'].mean())
    distance = geodesic(start, end).meters
    print(f"Distance between Zone {top_50_zones[i]} and Zone {top_50_zones[i+1]}: {distance:.2f} meters")
C:\Users\ssgul\AppData\Local\Temp\ipykernel_4824\587802739.py:34: UserWarning: Converting to PeriodArray/Index representation will drop timezone information.
  df_2['month'] = df_2['status_timestamp'].dt.to_period('M')
Map saved as 'parking_availability_map.html'. Open it in a browser to view.

Distances Between First 5 Zones:
Distance between Zone 7084.0 and Zone 7649.0: 1169.86 meters
Distance between Zone 7649.0 and Zone 7672.0: 21.58 meters
Distance between Zone 7672.0 and Zone 7556.0: 335.07 meters
Distance between Zone 7556.0 and Zone 7768.0: 919.54 meters
Distance between Zone 7768.0 and Zone 7767.0: 0.69 meters
In [22]:
import geopandas as gpd
print("GeoPandas installed and working!")
GeoPandas installed and working!

21. Optimizing Urban Parking Availability Through Dataset Relationships¶

Performed an optimization model to suggest where to add or remove restrictions to achieve better distribution of parking availability.

A sort of different internal databases were used; polars, duckdb and sqlite databases.

Important features and the role of the provided databases in coding as seen below,

Polars: Polars to look both datasets, clean and format the data, and join them into a combined, ready-to-analyze DataFrame. This ensures that the optimization model starts with a high-quality dataset including relevant time, location, and occupancy information.

DuckDB: DuckDB’s fast SQL queries on the Polars DataFrame to quickly derive aggregated metrics ( average occupancy by zone and time period) and filtering conditions that inform which zones are the best candidates for changing restrictions.

SQLite: Persist the cleaned,and aggregated data in SQLite for stable access. As we iterate on the optimization model, we can reliably pull from this SQLite database, ensure consistent input data.

In [4]:
import sys
print(sys.executable)
c:\Users\ssgul\anaconda3\python.exe
In [ ]:
import requests
import pandas as pd
import polars as pl
import duckdb
import sqlite3
from io import StringIO
import math
import cvxpy as cp


# Step 1: Data Fetching and Basic Preprocessing


base_url_1 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_1 = 'sign-plates-located-in-each-parking-zone-copy'
url_1 = f"{base_url_1}{dataset_id_1}/exports/csv"

base_url_2 = 'https://data.melbourne.vic.gov.au/api/explore/v2.1/catalog/datasets/'
dataset_id_2 = 'on-street-parking-bay-sensors'
url_2 = f"{base_url_2}{dataset_id_2}/exports/csv"

# Fetch datasets
response_1 = requests.get(url_1)
response_2 = requests.get(url_2)

df_1 = pd.read_csv(StringIO(response_1.text), delimiter=';')
df_2 = pd.read_csv(StringIO(response_2.text), delimiter=';')

df_1.columns = ['parkingzone', 'restriction_days', 'time_restrictions_start', 'time_restrictions_finish', 'restriction_display']
df_2.columns = ['lastupdated', 'status_timestamp', 'zone_number', 'status_description', 'kerbsideid', 'location']


# Convert to Polars and Compute Occupancy Stats Using DuckDB


# Instead of Polars groupby, we use DuckDB to compute occupancy:
con = duckdb.connect()
con.register("df_sensors", df_2)

occupancy_query = """
SELECT 
    zone_number,
    AVG(CASE WHEN status_description = 'Occupied' THEN 1.0 ELSE 0.0 END) AS avg_occupancy_rate
FROM df_sensors
GROUP BY zone_number
"""

zone_occupancy_df = con.execute(occupancy_query).fetchdf()
zone_occupancy = pl.from_pandas(zone_occupancy_df)  # If needed as Polars

pl_1 = pl.from_pandas(df_1)


# Join with DuckDB

con.register("df_zones", df_1)
con.register("df_occ", zone_occupancy_df)

join_query = """
SELECT z.parkingzone, z.restriction_days, z.time_restrictions_start, z.time_restrictions_finish, o.avg_occupancy_rate
FROM df_zones z
LEFT JOIN df_occ o
ON CAST(z.parkingzone AS INTEGER) = o.zone_number
"""

df_joined = con.execute(join_query).fetchdf()


# Store in SQLite (Optional)

conn = sqlite3.connect(":memory:")
df_joined.to_sql("joined_data", conn, if_exists="replace", index=False)

cur = conn.cursor()
cur.execute("SELECT parkingzone, avg_occupancy_rate FROM joined_data ORDER BY avg_occupancy_rate DESC LIMIT 5;")
print("Sample SQLite Query Result:", cur.fetchall())


# Step 5:  Optimization Model (Used CVXPY)


df_model = df_joined.dropna(subset=["avg_occupancy_rate"])
zones = df_model["parkingzone"].unique()
target_occupancy = 0.5
alpha = 0.05  

# Extracting old occupancy

old_occ_dict = {}
for i, row in df_model.iterrows():
    z = row["parkingzone"]
    old_occ_dict[z] = row["avg_occupancy_rate"] if not math.isnan(row["avg_occupancy_rate"]) else target_occupancy

# Defining CVXPY variables:
# Now Δstart_z and Δend_z represent shifts in days.
# Constraints: Δstart_z, Δend_z in [-1, 1] days
delta_start = {z: cp.Variable(name=f"delta_start_{z}") for z in zones}
delta_end   = {z: cp.Variable(name=f"delta_end_{z}") for z in zones}

constraints = []
for z in zones:
    constraints += [
        delta_start[z] >= -1,
        delta_start[z] <= 1,
        delta_end[z]   >= -1,
        delta_end[z]   <= 1
    ]

#  The reason is to minimize sum of squared deviations from target occupancy
# Note that please I assume the same linear relationship with alpha per day now.
objective_expr = 0
for z in zones:
    new_occ = old_occ_dict[z] + alpha*(delta_end[z] - delta_start[z])
    objective_expr += (new_occ - target_occupancy)**2

problem = cp.Problem(cp.Minimize(objective_expr), constraints)
problem.solve()

print("Optimization Status:", problem.status)
print("Objective value:", problem.value)
for z in zones:
    new_occ_val = old_occ_dict[z] + alpha*(delta_end[z].value - delta_start[z].value)
    print(f"Zone {z}: Δstart={delta_start[z].value:.4f} days, Δend={delta_end[z].value:.4f} days, Predicted New Occ={new_occ_val:.4f}")
Sample SQLite Query Result: [(7454, 0.0), (7479, 0.0), (7486, 0.0), (7486, 0.0), (7487, 0.0)]
Optimization Status: optimal
Objective value: 40.47999999999984
Zone 7454: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7479: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7486: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7487: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7500: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7498: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7508: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7514: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7520: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7528: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7529: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7532: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7533: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7537: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7539: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7541: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7548: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7549: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7551: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7554: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7556: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7553: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7557: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7572: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7575: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7579: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7592: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7595: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7596: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7605: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7606: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7607: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7608: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7612: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7615: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7622: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7625: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7628: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7633: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7638: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7644: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7646: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7695: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7705: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7725: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7722: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7739: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7728: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7740: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7757: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7752: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7936: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7938: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7981: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7988: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7995: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7014: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7019: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7025: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7081: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7084: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7089: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7161: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7167: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7190: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7193: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7195: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7197: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7202: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7200: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7207: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7222: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7223: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7229: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7232: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7231: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7234: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7236: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7239: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7241: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7243: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7244: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7246: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7251: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7252: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7259: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7267: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7273: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7297: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7332: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7333: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7334: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7335: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7339: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7343: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7350: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7356: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7359: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7358: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7396: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7399: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7401: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7402: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7423: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7428: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7434: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7474: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7494: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7507: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7512: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7509: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7522: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7536: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7538: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7545: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7547: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7550: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7570: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7569: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7577: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7584: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7586: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7611: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7634: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7692: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7708: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7716: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7721: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7753: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7910: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7922: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7939: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7948: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7986: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7018: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7049: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7076: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7159: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7165: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7170: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7188: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7184: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7194: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7203: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7208: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7214: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7227: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7228: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7255: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7253: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7254: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7269: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7271: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7336: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7345: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7348: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7363: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7379: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7392: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7394: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7406: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7411: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7412: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7417: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7438: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7451: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7534: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7594: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7603: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7610: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7614: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7639: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7642: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7647: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7649: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7674: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7706: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7720: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7748: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7800: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7923: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7924: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7930: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7985: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7993: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7053: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7156: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7163: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7178: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7173: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7183: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7186: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7182: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7185: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7189: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7191: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7205: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7220: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7230: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7245: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7247: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7265: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7274: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7275: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7282: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7301: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7331: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7360: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7366: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7413: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7436: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7446: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7476: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7558: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7568: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7635: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7643: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7726: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7766: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7010: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7237: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7260: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7278: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7280: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7355: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7377: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7527: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7552: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7566: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7624: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7258: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7270: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7302: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7362: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7519: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7571: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7712: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7212: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7213: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7219: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7264: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7320: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7450: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7497: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7261: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7266: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7418: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7425: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7160: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7452: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7727: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7250: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000
Zone 7400: Δstart=-1.0000 days, Δend=1.0000 days, Predicted New Occ=0.1000

22. Conclusion¶

I worked on parking slot occupancy detection in this research, which is critical for effective urban parking management. I gathered real-time parking data from Melbourne Open Data sources, pre-processed them, and employed advanced database modeling techniques to structure and relate datasets productively. For enhanced organization of data, I developed hierarchical, time series, and relational mappings and employed tools such as SQL and Python in uncovering insights, through indexing data for optimization of query performance thus visualizing spatial and temporal parking trends, with advanced geospatial libraries such as GeoPandas and Folium.

I designed machine learning models as well as those based on deep learning which aim at predicting whether there will be an available parking lot or not. By using regression and clustering techniques, I sought to understand how users behave when it comes to using parking spaces; utilizing Polars, SQLite and DuckDB among others for data processing in order to fine-tune these models. In different zones, I presented visual data highlighting the level of utilization, rotation rates and peak utilization time periods.

This way, I could make a detailed analysis of behavior patterns in parking lots, in-depth parking violation checking and spatial congestion exploring.

Through this project I was able to apply data science methods in addressing practical problems. A comprehensive framework which addresses various urban parking lot challenges was created by integrating machine learning, data modeling techniques, and visualization. Smarter parking solutions are being developed by me as part of this undertaking that involves real-time parking detection systems’ design along with efficient parking space management strategies. These endeavors are consistent with Melbourne’s goal of constructing a sustainable high-tech city.

23. References¶

[1]

[1] Glen Eira City Council. (2017) Parking Analysis for Bentleigh, Carnegie and Elsternwick Draft Structure Plans Glen Eira City Council — October 2017. Retrieved from https://www.gleneira.vic.gov.au/media/kwig2mdt/parking_analysis_for_bentleigh-e_plans_glen_eira_city_council.pdf

[2]

[2] Rodríguez, A., Alonso, B., Moura, J. L., & dell’Olio, L. (n.d.) Analysis of user behavior in urban parking under different level of information scenarios provided by smart devices or connected cars. Department of Transportation and Projects and Processes Technology – Universidad de Cantabria, Santander, Spain.

[3]

[3] Channamallu, S. S., Kermanshachi, S., Rosenberger, J. M., & Pamidimukkala, A. (n.d.) Parking occupancy prediction and analysis - a comprehensive study. University of Texas at Arlington. Retrieved from https://www.researchgate.net/publication/374947267_Parking_occupancy_prediction_and_analysis_-a_comprehensive_study

[4]

[4] Kuhail, M. A., Boorlu, M., Padarthi, N., & Rottinghaus, C. (2019, October 14–17). [Title not provided]. 2019 IEEE International Smart Cities Conference (ISC2). IEEE. DOI: 10.1109/ISC246665.2019.9071688. Retrieved from https://ieeexplore.ieee.org/document/9071688

[5] Zhang, W., Li, K., & Wang, J. (2018) Data-Driven Analysis of Urban Parking Patterns, Springer, Berlin, Germany. [Link]